我有一个球衣应用程序,它会为某些注释@Provider
添加@MyAnnotation
。 @Provider
课程为MyAnnotationListener implements ApplicationEventListener
。
如何向泽西添加多个MyAnnotationListener
实例,以便每个@MyAnnotation
- 带注释的方法都会触发所有这些已注册的实例?我在这里看到的问题是,MyAnnotationListener实例需要一些内部引用,因此无法使用无参数构造函数进行实例化。
答案 0 :(得分:0)
您尝试执行的操作的问题是您希望将注释视为name binding annotation。 AFAIK,这仅适用于过滤器和拦截器
我能想到的唯一方法就是从RequestEvent
的{{1}}方法中获取onEvent
ExtendedUriInfo
,然后做一些反思来获取注释。检查它是否为空。
例如
RequestEventListener
请注意,您需要查看RequestEvent.Type
,因为@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;
}
}
}
对所有活动类型都不可用。