2017-01-13 3 views
1

Я реализовал приложение JAX-RS, используя Jersey 2.24.Джерси: обнаружение при создании класса контроллера

Я использую мост Guice-HK2 так, чтобы классы контроллера (аннотированные @Path) вводились зависимостями от Guice, а не от Jersey/HK2.

Однако HK2 все еще создает экземпляры самих аннотированных классов @Path.

Есть ли способ, которым я могу подключиться к Джерси/HK2, чтобы я получил уведомление, когда создан аннотированный класс @Path? Как какой-то прослушиватель жизненного цикла? Каждый раз, когда аннотированный класс @Path создан компанией Jersey/HK2, я хочу сделать регистрацию/регистрацию этого класса.

Если Guice делал фактическое создание аннотированного класса @Path, я думаю, что смогу сделать это с использованием общего Provider, но это невозможно в этом случае, так как Джерси/HK2 создает реальный экземпляр.

спасибо !!

ответ

0

Я думаю, что наименее навязчивым способом было бы просто использовать АОП. HK2 предлагает АОП. Вы можете создать ConstructorInterceptor. Что-то вроде

public class LoggingConstructorInterceptor implements ConstructorInterceptor { 

    private static final Logger LOG 
      = Logger.getLogger(LoggingConstructorInterceptor.class.getName()); 

    @Override 
    public Object construct(ConstructorInvocation invocation) throws Throwable { 
     Constructor ctor = invocation.getConstructor(); 
     LOG.log(Level.INFO, "Creating: {0}", ctor.getDeclaringClass().getName()); 

     // returned instance from constructor invocation. 
     Object instance = invocation.proceed(); 
     LOG.log(Level.INFO, "Created Instance: {0}", instance.toString()); 

     return instance; 
    } 
} 

Затем создайте InterceptorService, чтобы использовать только перехватчик для классов, аннотированных @Path

public class PathInterceptionService implements InterceptionService { 

    private static final ConstructorInterceptor CTOR_INTERCEPTOR 
      = new LoggingConstructorInterceptor(); 
    private final static List<ConstructorInterceptor> CTOR_LIST 
      = Collections.singletonList(CTOR_INTERCEPTOR); 

    @Override 
    public Filter getDescriptorFilter() { 
     return BuilderHelper.allFilter(); 
    } 

    @Override 
    public List<MethodInterceptor> getMethodInterceptors(Method method) { 
     return null; 
    } 

    @Override 
    public List<ConstructorInterceptor> getConstructorInterceptors(Constructor<?> ctor) { 
     if (ctor.getDeclaringClass().isAnnotationPresent(Path.class)) { 
      return CTOR_LIST; 
     } 
     return null; 
    } 
} 

Тогда просто зарегистрировать InterceptionService и ConstructorInterceptor с системой DI

new ResourceConfig() 
     .register(new AbstractBinder(){ 
      @Override 
      public void configure() { 
       bind(PathInterceptionService.class) 
         .to(InterceptionService.class) 
         .in(Singleton.class); 
        bind(LoggingConstructorInterceptor.class) 
         .to(ConstructorInterceptor.class) 
         .in(Singleton.class); 
      } 
     }); 

Смотреть полный пример в this Gist

Смотрите также:

+0

Это работало !! Большое спасибо!! Я заметил, что привязка строки 91 не требуется, потому что класс создается только с ключевым словом 'new' и не вводится. – user3303372

+0

Да, ваше право. Думаю, я экспериментировал с кучей разных вещей. –

Смежные вопросы