2014-05-02 37 views
2

嗨,我有一个非常简单的例子。我的JavaEE 7中创建一个资源,如下所示:@inject不适用于无状态的EJB

@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"; 
    } 
} 

最后的资源应用类:

@ApplicationPath("resources") 
public class RestConfiguration extends Application { 

} 

我可以访问的网址: “localhost:8081/jasonandjaxrs/resources/greetings”

问题是@Inject给出了t他以下错误:

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不起作用?谢谢。

回答

3

在此设置下,您不能使用CDI(表示@Inject)。 CDI仅适用于由容器管理的bean,而JAX-RS资源类(您的GreetingsResource)并非如此。

JAX-RS 2.0 does not support injection of EJBs into JAX-RS components (providers, resources).

如果你的情况使用@Inject注入由HK2依赖注入框架,不知道正常的CDI豆提供。它甚至不应该工作,如果你使用@EJB,我不知道它为什么工作,也许这与Java EE 7有关。

因为它适合你,所以在这里使用@EJB应该没有问题,但我在回应this question时也有一些替代方法。

参见:

+0

谢谢@unwichtich。我向资源添加了无状态,并且最初给了我一个错误“不支持JAX-RS EJB集成”。它在重新启动服务器后工作。我只是在尝试不同的事情。在java ee中有不同的注释是否有很好的教程?谢谢。 –

+0

主要有关于所有注释的技术参考文档,但我认为这是一个很好的例子列表:http://tomee.apache.org/java-ee-6-annotation-examples.html – unwichtich