リソースとフィルターに挿入したい POJO があります。
public final class MyObject { }
そのためのカスタム プロバイダーを実装しました。
@Provider
public final class MyProvider
extends AbstractHttpContextInjectable<MyObject>
implements InjectableProvider<Context, Type> {
@Context private HttpServletRequest request;
@Override
public Injectable<MyObject> getInjectable(
ComponentContext componentContext,
Context annotation,
Type type
) {
if (type.equals(MyObject.class)) {
return this;
}
return null;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public MyObject getValue(HttpContext httpContext) {
//in reality, use session info from injected request to create MyObject
return new MyObject();
}
}
オブジェクトがリソースに正常に挿入されました。
@Path("/test")
@ResourceFilters(MyFilter.class)
public final class MyResource {
@Context private HttpServletRequest request;
@Context private MyObject myObject;
@GET
public String execute() {
System.out.println(request != null); //true
System.out.println(myObject != null); //true
return "data";
}
}
しかし、Jersey はそれをフィルターに挿入できません。
public final class MyFilter implements ResourceFilter {
@Context private HttpServletRequest request;
@Context private MyObject myObject;
@Override
public ContainerRequestFilter getRequestFilter() {
return new ContainerRequestFilter() {
@Override
public ContainerRequest filter(ContainerRequest containerRequest) {
System.out.println(request != null); //true
System.out.println(myObject != null); //false
return containerRequest;
}
};
}
@Override
public ContainerResponseFilter getResponseFilter() {
return null;
}
}
違いは、注入がスレッドローカルインスタンスに従うプロキシを使用して行われるという事実に関係していると推測していMyFilter
ます-これは、注釈が付けられたフィールド@Context
が外側のクラスで宣言されているためです。これは一度インスタンス化されますが、それらはリクエストごとにオブジェクトを注入するために使用されます。デバッグ中にステップスルーすると、 のインスタンスをラップするプロキシfilter
を指していることがわかります。MyFilter.request
com.sun.jersey.server.impl.container.servlet.ThreadLocalInvoker
フィルターにカスタム インジェクションを実行する必要があるカスタム プロバイダー (またはその他の実装) に欠けているものは何ですか?
私は現在、Jersey 1.1.4.1 で立ち往生していることに注意してください (申し訳ありません)。
編集: Jersey 1.17 を使用すると、代わりに起動時に例外が発生します:
SEVERE: フィールドの依存関係がありません: private mypackage.MyObject mypackage.MyFilter.myObject