嗨,我有一个非常简单的例子。我在javaee 7中创建了一个资源,如下所示:
@Path("greetings")
public class GreetingsResource {
@Inject
Sample s;
@GET
public JsonObject greetings(){
return Json.createObjectBuilder().add("first","1")
.add("second","2")
.add("third","3")
.add("fourth","4")
.add("helloworld", s.helloWorld())
.build();
}
}
示例是以下简单的EJB:
@Stateless
public class Sample {
public String helloWorld(){
return "Hello World";
}
}
最后是资源Application类:
@ApplicationPath("resources")
public class RestConfiguration extends Application {
}
我可以访问该网址:“localhost:8081 / jasonandjaxrs / resources / greetings”
问题是@Inject会出现以下错误:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=sample,parent=GreetingsResource,qualifiers={}),position=-1,optional=false
但@EJB似乎有效。我想了解为什么@Inject不起作用?谢谢。
答案 0 :(得分:3)
您无法在此设置中使用CDI(表示@Inject
)。 CDI仅适用于容器管理的bean,而不是JAX-RS资源类(您的GreetingsResource
)。
JAX-RS 2.0不支持将EJB注入JAX-RS组件 (提供者,资源)。
如果在您的情况下使用@Inject
,注入由HK2依赖注入框架提供,该框架不了解正常的CDI bean。如果您使用@EJB
,它甚至不会起作用,我不知道它为什么会起作用,这可能与Java EE 7有关。
因为它对你有用,所以在这里使用@EJB
应该没有问题,但我对this question的回复也有一些替代方法。
另见: