2012-02-29 11 views
3

新しいポスターは、私はブレーキ任意のルール:)GoogleのGuiceの、インターセプタとPrivateModulesここ

私は同じ環境のために複数のデータソースのを持っているために、グーグル、Guiceの中PrivateModuleを使用していますがないことを望みます。しかし私は、MethodInterceptorをプライベートモジュールの内部で動作させるのに苦労しています。 以下は "問題"を説明する簡単なテストケースです。

シンプルなサービスクラスは次のようになります。

interface Service { 
    String go(); 
} 

class ServiceImpl implements Service { 

    @Override @Transactional 
    public String go() { 
     return "Test Case..."; 
    } 

} 

MyModuleクラスは次のようになります。あなたがへの出力を期待

public class TestCase { 

    @Inject Service service; 

    public TestCase() { 
     Guice.createInjector(new MyModule()).injectMembers(this); 
    } 

    public String go() { 
     return service.go(); 
    } 

    public static void main(String[] args) { 
     TestCase t = new TestCase(); 
     System.out.println(t.go()); 
    } 

} 

class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     install(new PrivateModule() { 
      @Override 
      protected void configure() { 
       bind(Service.class).to(ServiceImpl.class); 
       bindInterceptor(
        Matchers.any(), 
        Matchers.annotatedWith(Transactional.class), 
        new MethodInterceptor() { 
        @Override 
        public Object invoke(MethodInvocation i) 
          throws Throwable { 
         System.out.println("Intercepting: " 
           + i.getMethod().getName()); 
         return i.proceed(); 
        } 
       }); 
       expose(Service.class); 
      } 
     }); 
    } 

} 

、最終的なテストケースbe:

しかし、それは起こらない、インターセプターは使用されていません、唯一のTest Case...が出力されます。

インターフェイスの代わりにServiceImplをバインドまたは公開すると機能します。事前に

おかげで、 よろしく、 LL

答えて

0

は、うーん...私は質問を投稿直後にそれを考え出した:)

問題は、あなたもServiceImplクラスをexpose()する必要があるということです。 バインド/公開はそうです。

bind(ServiceImpl.class); // ServiceImpl annotated with @Singleton 
bind(Service.class).to(ServiceImpl.class); 
expose(ServiceImpl.class); 
expose(Service.class); 

よろしく、あなたが明示的にプライベートモジュールでServiceImplをバインドする必要が
LL

0

。既存のコードの問題は、親モジュールからのServiceImplのバインドを継承することです。 PrivateModuleドキュメントから

プライベートモジュールは、親インジェクタを使用して実装されています。依存関係を満たすことができる場合、ジャストインタイムバインディングはルート環境で作成されます。このようなバインディングは、ツリー内のすべての環境で共有されます。この行を追加する

問題を修正するべきではない:私は前回の記事で述べたよう

bind(ServiceImpl.class); 
+0

ませthat'tを十分でない、あなたはまた、結合を公開する必要があります。 – luislobo

+2

あなたはそれを縛るだけです。それをプライベートモジュールから公開する必要はありません(プライベートモジュールのポイントをいくらか打ち負かします)。 –

関連する問題