簡體   English   中英

如何使兩個運動衫組件聽同一個注解?

[英]how to make two jersey components listen to the same annotation?

我有一個球衣應用程序,它不添加一個@Provider一些注釋@MyAnnotation @Provider類是MyAnnotationListener implements ApplicationEventListener

如何將多個MyAnnotationListener實例添加到jersey,以便每個@MyAnnotation方法都觸發所有已注冊的實例? 我在這里看到的問題是,MyAnnotationListener實例需要一些內部引用,因此無法使用無參數構造函數實例化。

您要嘗試執行的操作的問題在於,您要將注釋視為名稱綁定注釋 AFAIK,這僅適用於過濾器和攔截器

我能想到的唯一方法就是從RequestEventonEvent方法中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM