10.3. 사용자 정의 핸들러 생성

사용자 지정 핸들러를 정의하는 방법은 다음 두 가지가 있습니다.

WEB-INF/jboss-web.xml 파일을 사용하여 사용자 지정 핸들러 정의

사용자 지정 핸들러는 WEB-INF/jboss-web.xml 파일에 정의할 수 있습니다.

예제: WEB-INF/jboss-web.xml에서 사용자 지정 핸들러 정의

<jboss-web>
    <http-handler>
        <class-name>org.jboss.example.MyHttpHandler</class-name>
    </http-handler>
</jboss-web>

예제: HttpHandler Class

package org.jboss.example;

import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;

public class MyHttpHandler implements HttpHandler {
    private HttpHandler next;

    public MyHttpHandler(HttpHandler next) {
        this.next = next;
    }

    public void handleRequest(HttpServerExchange exchange) throws Exception {
        // do something
        next.handleRequest(exchange);
    }
}

WEB-INF/jboss-web.xml 파일을 사용하여 사용자 지정 핸들러에 대한 매개 변수를 설정할 수도 있습니다.

예제: WEB-INF/jboss-web.xml에서 매개 변수 정의

<jboss-web>
    <http-handler>
        <class-name>org.jboss.example.MyHttpHandler</class-name>
        <param>
            <param-name>myParam</param-name>
            <param-value>foobar</param-value>
        </param>
    </http-handler>
</jboss-web>

이러한 매개 변수가 작동하려면 핸들러 클래스에 해당 setter가 있어야 합니다.

예제: 핸들러에서 Setter 방법 정의

package org.jboss.example;

import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;

public class MyHttpHandler implements HttpHandler {
    private HttpHandler next;
    private String myParam;

    public MyHttpHandler(HttpHandler next) {
        this.next = next;
    }

    public void setMyParam(String myParam) {
        this.myParam = myParam;
    }

    public void handleRequest(HttpServerExchange exchange) throws Exception {
        // do something, use myParam
        next.handleRequest(exchange);
    }
}

WEB-INF/undertow-handlers.conf 파일에서 사용자 지정 핸들러 정의

핸들러를 정의하는 데 WEB-INF/jboss-web.xml 을 사용하는 대신 WEB-INF/undertow-handlers.conf 파일에 정의할 수도 있습니다.

myHttpHandler(myParam='foobar')

WEB-INF/undertow-handlers.conf 에 정의된 핸들러가 작동하려면 다음 두 가지를 만들어야 합니다.

  1. 해당 구문 비트 for undertow-handlers.conf 를 정의하는 HandlerBuilder 구현으로 HandlerWrapper 로 래핑된 HttpHandler 를 생성합니다.

    예제: HandlerBuilder 클래스

    package org.jboss.example;
    
    import io.undertow.server.HandlerWrapper;
    import io.undertow.server.HttpHandler;
    import io.undertow.server.handlers.builder.HandlerBuilder;
    
    import java.util.Collections;
    import java.util.Map;
    import java.util.Set;
    
    public class MyHandlerBuilder implements HandlerBuilder {
        public String name() {
            return "myHttpHandler";
        }
    
        public Map<String, Class<?>> parameters() {
            return Collections.<String, Class<?>>singletonMap("myParam", String.class);
        }
    
        public Set<String> requiredParameters() {
            return Collections.emptySet();
    
        }
    
        public String defaultParameter() {
            return null;
    
        }
    
        public HandlerWrapper build(final Map<String, Object> config) {
            return new HandlerWrapper() {
                public HttpHandler wrap(HttpHandler handler) {
                    MyHttpHandler result = new MyHttpHandler(handler);
                    result.setMyParam((String) config.get("myParam"));
                    return result;
                }
            };
        }
    }

  2. 파일의 항목. META-INF/services/io.undertow.server.handlers.builder.HandlerBuilder. 이 파일은 WEB-INF/classes 와 같은 클래스 경로에 있어야 합니다.

    org.jboss.example.MyHandlerBuilder