ジャージーの注射機構を理解するのは難しいです。 JAX-RS仕様書(http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005)では、アプリケーションサブクラス、ルートリソースクラス、およびプロバイダで@Context経由の注入が可能であると記載されています。ジャージー@Contextスコープ
私は、起動時にインスタンス化され、すべての要求に対して呼び出されるメソッドを持つクラスを持つようになりました。メソッドの中で、現在のUriInfoオブジェクトにアクセスする必要があります。問題は、このメソッドが自分のコードから呼び出されないということです。だから、UriInfoをメソッドに直接渡すことはできません。
は、私が実際にこのような何かをしたい:
public class MyClass implements ThirdPartyInterface {
// not possible because class is no Application subclass, root resource class or provider
@Context
private UriInfo uriInfo;
public void methodCallebByThirdPartyCode() {
Uri requestUri = uriInfo.getRequestUri();
// do something
}
}
が、私はこれを試してみました。明らかに成功なし:
public class MyClass implements ThirdPartyInterface {
private UriInfo uriInfo;
public MyClass(UriInfo uriInfo) {
this.uriInfo = uriInfo;
}
public void methodCallebByThirdPartyCode() {
Uri requestUri = uriInfo.getRequestUri();
// do something
}
}
@Provider
@Produces(MediaType.WILDCARD)
public class MyBodyWriter implements MessageBodyWriter<MyView> {
@Context
private UriInfo uriInfo;
private MyClass myClass;
private ThirdPartyClass thirdPartyClass;
public MyBodyWriter() {
// uriInfo is null at this time :(
myClass = new MyClass(uriInfo);
thirdPartyClass = new ThirdPartyClass();
thirdPartyClass.register(myClass);
}
public void writeTo(final MyView view, final Class<?> type, /* and so on */) throws IOException, WebApplicationException {
// execute() calls MyClass#methodCallebByThirdPartyCode()
thirdPartyClass.execute();
}
}
これは私が考えることができる唯一の回避策です。私はそれが非常にきれいだとは思わない:
public class MyClass implements ThirdPartyInterface {
private UriInfo uriInfo;
public void setUriInfo(final UriInfo uriInfo) {
this.uriInfo = uriInfo;
}
public void methodCallebByThirdPartyCode() {
Uri requestUri = uriInfo.getRequestUri();
// do something
}
}
@Provider
@Produces(MediaType.WILDCARD)
public class MyBodyWriter implements MessageBodyWriter<MyView> {
@Context
private UriInfo uriInfo;
private MyClass myClass;
private ThirdPartyClass thirdPartyClass;
public MyBodyWriter() {
myClass = new MyClass();
thirdPartyClass = new ThirdPartyClass();
thirdPartyClass.register(myClass);
}
public void writeTo(final MyView view, final Class<?> type, /* and so on */) throws IOException, WebApplicationException {
myClass.setUriInfo(uriInfo);
// execute() calls MyClass#methodCallebByThirdPartyCode()
thirdPartyClass.execute();
myClass.setUriInfo(null);
}
}
私はそこに良い解決策があると思うが、多分私は間違ったトラックにいる。
ありがとうございます!あなたは注射用org.glassfish.hk2.api.Factory
とjavax.inject.Provider
を使用することができます
:
「ContainerRequestFilter'が必要なのでしょうか? – Willy
私の状況でこれが機能するかどうかわかりません。この仕様では、「プロバイダクラスはJAX-RSランタイムによってインスタンス化されています」と記載されています。しかし、私は建設時にオブジェクトを参照して、それを第三者のサービスに渡す必要があります。 –