[英]how to make two jersey components listen to the same annotation?
我有一個球衣應用程序,它不添加一個@Provider
一些注釋@MyAnnotation
。 @Provider
類是MyAnnotationListener implements ApplicationEventListener
。
如何將多個MyAnnotationListener
實例添加到jersey,以便每個@MyAnnotation
方法都觸發所有已注冊的實例? 我在這里看到的問題是,MyAnnotationListener實例需要一些內部引用,因此無法使用無參數構造函數實例化。
您要嘗試執行的操作的問題在於,您要將注釋視為名稱綁定注釋 。 AFAIK,這僅適用於過濾器和攔截器
我能想到的唯一方法就是從RequestEvent
的onEvent
方法中的RequestEventListener
獲取ExtendedUriInfo
,然后進行一些反射以獲取批注。 檢查它是否為空。
例如
@Provider
public class TestApplicationListener implements ApplicationEventListener {
@Target({METHOD})
@Retention(RetentionPolicy.RUNTIME)
public static @interface SomeAnnotation {
}
@Override
public void onEvent(ApplicationEvent ae) {}
@Override
public RequestEventListener onRequest(RequestEvent re) {
return new RequestListener();
}
public static class RequestListener implements RequestEventListener {
@Override
public void onEvent(RequestEvent re) {
switch (re.getType()) {
case RESOURCE_METHOD_START:
if (hasAnnotation(re))
System.out.println("-- record method start event --");
break;
case RESOURCE_METHOD_FINISHED:
if (hasAnnotation(re))
System.out.println("-- record method end event --");
break;
}
}
private boolean hasAnnotation(RequestEvent e) {
ResourceMethod resourceMethod = e.getUriInfo().getMatchedResourceMethod();
Invocable invocable = resourceMethod.getInvocable();
SomeAnnotation annotation = invocable.getHandlingMethod()
.getAnnotation(SomeAnnotation.class);
return annotation != null;
}
}
}
請注意,您需要檢查RequestEvent.Type
,因為ResourceMethod
不適用於所有事件類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.