如何让两个球衣组件听同样的注释?

时间:2015-09-07 11:32:06

标签: java jersey-2.0

我有一个球衣应用程序,它会为某些注释@Provider添加@MyAnnotation@Provider课程为MyAnnotationListener implements ApplicationEventListener

如何向泽西添加多个MyAnnotationListener实例,以便每个@MyAnnotation - 带注释的方法都会触发所有这些已注册的实例?我在这里看到的问题是,MyAnnotationListener实例需要一些内部引用,因此无法使用无参数构造函数进行实例化。

1 个答案:

答案 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; } } } 对所有活动类型都不可用。