@inject不适用于无状态EJB

时间:2014-05-02 23:08:26

标签: glassfish ejb java-ee-7

嗨,我有一个非常简单的例子。我在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不起作用?谢谢。

1 个答案:

答案 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的回复也有一些替代方法。

另见: