2014-09-23 83 views
4

所以我決定開始使用Undertow,既是一個實驗,也是由於它在基準測試中取得的巨大成果。雖然我認爲這太棒了,但有一項功能可能會丟失或找不到。如何處理Undertow中的HTTP方法?

我想開發一個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)在上述情況下正確使用註釋的正確方法是什麼?

回答

5

設法找到一些答案與紅帽團隊和暗潮貢獻者的幫助,希望這可以幫助別人:

1)暗潮的最新版本有一個io.undertow.server.RoutingHandler類做我提出了同樣的事情,只是不需要註釋。

2)JBoss有RESTEasy的適配器:resteasy-undertow或包含RESTEasy + Undertow + Weld的定製框架hammock

3)Undertow已經支持Servlets 3,所以他們可以結合使用註釋,如果你喜歡。