8

カスタムコンテキストがあります:

public class MyContext {
    public String doSomething() {...}
}

コンテキストリゾルバを作成しました:

@Provider
public class MyContextResolver implements ContextResolver<MyContext> {

     public MyContext getContext(Class<?> type) {
         return new MyContext();
     }
}

今、リソースで私はそれを注入しようとしています:

@Path("/")
public class MyResource {

    @Context MyContext context;

}

そして、次のエラーが表示されます。

SEVERE: Missing dependency for field: com.something.MyContext com.something.MyResource.context

同じコードは Apache Wink 1.1.3 では問題なく動作しますが、Jersey 1.10 では失敗します。

どんなアイデアでも大歓迎です。

4

2 に答える 2

10

JAX-RS 仕様は、Apache Wink によって提供される動作を義務付けていません。IOW、Apache Winkで動作する使用しようとしている機能により、コードが移植できなくなります。

100% JAX-RS 移植可能なコードを生成するには、javax.ws.rs.ext.Providers インスタンスを挿入してから以下を使用する必要があります。

ContextResolver<MyContext> r = Providers.getContextResolver(MyContext.class, null);
MyContext ctx = r.getContext(MyContext.class);

MyContext インスタンスを取得します。

Jersey では、ContextResolver を直接注入することもできます。これにより、上記のコードを 1 行節約できますが、この戦略も 100% 移植可能ではないことに注意してください。

于 2011-12-12T13:01:37.027 に答える
0

InjectableProviderを実装します。ほとんどの場合、PerRequestTypeInjectableProviderまたはSingletonTypeInjectableProviderを拡張します。

@Provider
public class MyContextResolver extends SingletonTypeInjectableProvider<Context, MyContext>{
    public MyContextResolver() {
        super(MyContext.class, new MyContext());
    }
}

あなたに持ってもらいます:

@Context MyContext context;
于 2013-03-19T06:59:46.387 に答える