所以我決定開始使用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)在上述情況下正確使用註釋的正確方法是什麼?