如何在Undertow中处理HTTP方法



所以我决定开始使用Undertow,这既是一个实验,也是因为它在基准测试中取得了很好的结果。虽然我觉得这很神奇,但有一个功能要么缺失,要么我找不到。

我想开发一个RESTful web服务,所以确定调用哪个HTTP方法对我来说很重要。现在,我可以从HttpServerExchange参数中的RequestMethod中获得它,但如果每个处理程序都必须这样做,那将变得乏味。

我的解决方案是:

创建了一个名为HTTPMethod:的注释接口

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) 
public @interface HTTPMethod {
public enum Method {
    OTHER, GET, PUT, POST, DELETE
}
Method method() default Method.OTHER;

一个"抽象"类(不是抽象的):

public abstract class RESTfulHandler implements HttpHandler {
@Override
public void handleRequest(HttpServerExchange hse) throws Exception {
    for (Method method : this.getClass().getDeclaredMethods()) {
        // if method is annotated with @Test
        if (method.isAnnotationPresent(HTTPMethod.class)) {
            Annotation annotation = method.getAnnotation(HTTPMethod.class);
            HTTPMethod test = (HTTPMethod) annotation;
            switch (test.method()) {
                case PUT:
                    if (hse.getRequestMethod().toString().equals("PUT")) {
                        method.invoke(this);
                    }
                    break;
                case POST:
                    if (hse.getRequestMethod().toString().equals("POST")) {
                        method.invoke(this);
                    }
                    break;
                case GET:
                    if (hse.getRequestMethod().toString().equals("GET")) {
                        method.invoke(this);
                    }
                    break;
                case DELETE:
                    if (hse.getRequestMethod().toString().equals("DELETE")) {
                        method.invoke(this);
                    }
                    break;
                case OTHER:
                    if (hse.getRequestMethod().toString().equals("OTHER")) {
                        method.invoke(this);
                    }
                    break;
            }
            if (test.method() == HTTPMethod.Method.PUT) {
                method.invoke(this);
            }
        }
    }
}

}

以及上述两者的实现:

public class ItemHandler extends RESTfulHandler{
@HTTPMethod(method=GET)
public List<String> getAllItems()
{
    System.out.println("GET");
    return new ArrayList<>();
}
@HTTPMethod(method=POST)
public void addItem()
{      
    System.out.println("POST");        
}
@HTTPMethod
public void doNothing()
{   
    System.out.println("OTHERS");      
}

}

正如我所说,它是有效的,但我确信抽象类和它的实现缺少一些东西,所以它们可以正确地粘合。所以我的问题有两个:

1) 在Undertow中是否有更好/正确的方法来过滤HTTP请求?2) 在上述情况下,正确使用注释的正确方法是什么?

在Redhat团队和Undertow贡献者的帮助下,设法找到了几个答案,希望这能帮助其他人:

1) 最新版本的Undertow有一个io.Undertow.server.RoutingHandler类,它做的事情与我建议的完全相同,只是不需要注释。

2) JBoss为RESTEasy提供了一个适配器:RESTEasy undertow或自定义框架吊床,其中包括RESTEasy+undertow+Weld。

3) Undertow已经支持Servlet 3,因此如果您愿意,可以将它们组合使用注释。

相关内容

  • 没有找到相关文章

最新更新