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.
私はジャージのドキュメントでプロキシを学ん苦労しました。どのようなヒントでも、このコードはシーンの背後で何をしていますか? – Nilesh
'proxy'は動的プロキシを作成させます。したがって、サービスにアクセスするたびに、プロキシになります。 'proxyForSameScope'は、親が同じスコープ、つまりリクエストスコープにある場合、それをプロキシにしないで、実際のオブジェクトを使用するだけです。たとえば、プロキシオブジェクトになりますが、これをリソースクラス(デフォルトで要求スコープ)に挿入しようとすると、実際のインスタンスになります。 –
私がリンクしている記事でこれ以上説明しています。また、動的プロキシについての記事にリンクされた記事があります。プロキシが背後でどのように働いているかを気にしていれば、それは良い読書かもしれません。 –