2017-01-13 5 views
1

ジャージーインターセプターは、アプリケーションの起動時に構築されます。したがって、その依存関係(この場合はCipher)がRequest Scopeから注入されます。Singleton jerseyインターセプタ内でRequestScopedオブジェクトを使用するにはどうすればよいですか?

暗号はstatefulなので、リクエストスコープに注入する必要があります。どうやってするか ?

public class BootstrapBinder extends AbstractBinder { 
    @Override 
    protected void configure() { 
    bindFactory(EncCipherFactory.class).to(Cipher.class).named("ENC_CIPHER").in(RequestScoped.class); 
    bindFactory(DecCipherFactory.class).to(Cipher.class).named("DEC_CIPHER").in(RequestScoped.class); 
    } 
} 

今明らかHK2(ジャージのDI)シングルトンインターセプター内部RequestScopedオブジェクトを注入カント - それぞれの新しい要求のための新たな暗号を期待

@Provider 
@Priority(Priorities.ENTITY_CODER + 1) 
public class CryptInterceptor implements ReaderInterceptor, WriterInterceptor { 

    @Inject @Named("ENC_CIPHER") 
    private Cipher encryptionCipher; 
    @Inject @Named("DEC_CIPHER") 
    private Cipher decryptionCipher; 

    @Override 
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException { 
     InputStream inputStream = context.getInputStream(); 
     CipherInputStream cipherInputStream = new CipherInputStream(inputStream, decryptionCipher); 
     context.setInputStream(cipherInputStream); 
     return context.proceed(); 
    } 

    @Override 
    public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { 
     OutputStream outputStream = context.getOutputStream(); 
     CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, encryptionCipher); 
     context.setOutputStream(cipherOutputStream); 
     context.proceed(); 
    } 
} 

はRequestScopeにそれらを注入するようなものです。原因:

java.lang.IllegalStateException: Not inside a request scope. 

答えて

2

サービスをプロキシする必要があります。そうしないとJerseyは実際のオブジェクトを注入しようとしますが、インターセプタが作成されると要求はありません。傍受者自身がスコープを要求しようとする限り、私は知らない。それが可能かどうかはわかりません。

bindFactory(EncCipherFactory.class) 
     .proxy(true) 
     .proxyForSameScope(false) 
     .to(Cipher.class) 
     .named("ENC_CIPHER") 
     .in(RequestScoped.class); 

他のものと同じことをやります。ただし、暗号インスタンスではなく、アクセスするとプロキシインスタンスになります。

関連項目:

+0

私はジャージのドキュメントでプロキシを学ん苦労しました。どのようなヒントでも、このコードはシーンの背後で何をしていますか? – Nilesh

+0

'proxy'は動的プロキシを作成させます。したがって、サービスにアクセスするたびに、プロキシになります。 'proxyForSameScope'は、親が同じスコープ、つまりリクエストスコープにある場合、それをプロキシにしないで、実際のオブジェクトを使用するだけです。たとえば、プロキシオブジェクトになりますが、これをリソースクラス(デフォルトで要求スコープ)に挿入しようとすると、実際のインスタンスになります。 –

+0

私がリンクしている記事でこれ以上説明しています。また、動的プロキシについての記事にリンクされた記事があります。プロキシが背後でどのように働いているかを気にしていれば、それは良い読書かもしれません。 –

関連する問題