尝试向Jersey注入自定义上下文时缺少字段依赖项

时间:2011-12-12 08:29:38

标签: java rest jersey jax-rs jsr311

我有自定义上下文:

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中失败。

任何想法都将受到赞赏。

2 个答案:

答案 0 :(得分:10)

JAX-RS规范并未强制要求Apache提供的行为 眨眼。 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%便携。

答案 1 :(得分:0)

实施InjectableProvider。最有可能的方法是扩展PerRequestTypeInjectableProvider或SingletonTypeInjectableProvider。

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

让你拥有:

@Context MyContext context;