所以我决定开始使用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)在上述情况下正确使用注释的正确方法是什么?
答案 0 :(得分:7)
在Redhat团队和Undertow贡献者的帮助下管理找到几个答案,希望这有助于其他人:
1)最新版本的Undertow有一个io.undertow.server.RoutingHandler类,它与我提出的完全相同,只是不需要注释。
2)JBoss的RESTEasy适配器:resteasy-undertow或自定义框架hammock,包括RESTEasy + Undertow + Weld。
3)Undertow已经支持Servlets 3,因此如果您愿意,可以将它们组合起来使用注释。