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,这样可以为你节省上面的一行代码,但请注意,这种策略也不是 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 回答