2017-01-13 14 views
1

に作成されたときに検出します。ジャージー:コントローラクラスは、私はジャージー2.24を使用してJAX-RSサーバーアプリケーションを実装しました

コントローラクラス(@Pathと注釈されたもの)にJersey/HK2ではなくGuiceの依存関係が注入されるように、Guice-HK2ブリッジを使用します。

しかし、HK2はまだ@Path注釈付きクラス自体のインスタンスを作成します。

@Path注釈付きクラスが作成されたときに通知されるように、Jersey/HK2に接続する方法はありますか?ライフサイクルリスナーのようなもの? @Path注釈付きクラスはジャージー/ HK2によって作成されるたびに、私は、そのクラスのいくつかの登録/ロギングを行いたいです。

Guiceのは@Path注釈付きクラスの実際の作成をしていた場合、私は、一般的なProviderを使用してそれを行うことができると思うが、ジャージー/ HK2は、実際のインスタンスを作成しているので、それは、この場合には利用できません。

ありがとうございました!

答えて

0

私は、少なくとも侵入的な方法だけでAOPを使用することだと思います。 HK2はAOPを提供しています。できることは、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; 
    } 
} 

ような何かその後それからちょうど完全な参照してください

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); 
      } 
     }); 

DIシステムでInterceptionServiceConstructorInterceptorを登録@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; 
    } 
} 

で注釈を付けたクラス用のインターセプターを使用するだけにInterceptorServiceを作成this Gist

の例3210

関連項目:働い

+0

!!どうもありがとうございました!!クラスは単に 'new'キーワードで作成され、注入されないので、91行目の束縛は必要ないことに気付きました。 – user3303372

+0

ええ、あなたの権利。私はいろいろなことを試していたと思う。 –

関連する問題