【问题标题】:Jersey EJB injection泽西 EJB 注入
【发布时间】:2015-09-22 08:04:12
【问题描述】:

我阅读了很多关于使用 jax rs 2.0 尤其是球衣进行注入的可能性。

我什至在 jax rs 2.0 规范中读到了 ejb 注入。但是我在网上阅读的各种帖子中仍然没有找到一个独特的解决方案。

在我正在使用的用例中:

WildFly 9.0 和 Jersey 2.x

我有一个 web 应用程序公开我的 REST 服务并导入一个实现我的模型数据的 jar。

这是 CDI 方法:

@RequestScoped 
@Path("/myPath")
public class ModelRetriever {

@Context
SecurityContext securityContext;

@Inject
private IMyModel MyModel;   

@Path("{i}")          
@GET 
@Produces("application/json")
public Response countries(@PathParam("i") String countryId) 
        throws JSONException, Failure, IOException {

    MyModel.doSomething();
}

这是我的 IMyModel 界面

public interface IKasPrincipal extends Principal {
    public void doSomething();
}

这是 MyModel 的实现:

@RequestScope
public class MyModelImpl implements IMyModel {

    public void doSomehting() {
        doSomething();
    }
}

我尝试的另一种方法是使用 EJB 注入来更改我以前的注释,如下所示:

@Stateless 
@Path("/myPath")
public class ModelRetriever {

@EJB
private IMyModel MyModel;   

@Path("{i}")          
@GET 
@Produces("application/json")
public Response countries(@PathParam("i") String countryId) 
        throws JSONException, Failure, IOException {

    MyModel.doSomething();
}

这是我的 IMyModel 界面

@Local
public interface IKasPrincipal extends Principal {
    public void doSomething();
}

这是 MyModel 的实现:

@Stateless
public class MyModelImpl implements IMyModel {

    public void doSomehting() {
        doSomething();
    }
} 

我使用 EJB 方法得到一个空对象,我使用 CDI 得到这个异常

Caused by: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=IMyModel,parent=ModelRetriever,qualifiers={},position=-1,optional=false,self=false,unqualified=null,616459318)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:75)
at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:211)
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:234)

那我有什么遗漏的吗?

【问题讨论】:

    标签: rest dependency-injection jax-rs jersey-2.0 ejb-3.1


    【解决方案1】:

    查看其他 Stack Overflow 相关帖子:

    Dependency injection with Jersey 2.0

    HK2 Jersey EJB 3 injection

    您遇到的问题是 HK2 不知道任何未直接注册到其中的内容,并且 HK2 试图满足您的 Jersey 感知类中的所有依赖项。

    我不久前遇到了这个问题。然后我发现泽西在内部使用了 HK2。 HK2 是一个 JSR-330 实现 (CDI)。

    有人会认为开源项目会声明它是 CDI bean 并使用它们而不管 CDI 实现如何,但它看起来不是那样的。

    见:https://java.net/jira/browse/JERSEY-1933

    见:https://hk2.java.net/integration.html


    您可以将您的组件注册到 HK2...

    见:https://jersey.java.net/documentation/latest/ioc.html

    据我所知,您不能使用您自己的(或您的容器的)CDI 实现将 CDI 组件(或其他任何东西,如 EJB)注入到 Jersey 的类中,除非您使用 Glassfish(我个人永远不会使用)反过来使用 HK2 作为其 CDI 实现。

    对我来说,这是一个主要的缺点。但唯一(?)泽西岛的退路。

    -也许我错过了什么(这很有可能)

    -也许这是 Oracle 的一个技巧,因此您不能在使用 OpenWeb Beans 作为 CDI 实现的 Websphere 应用程序中使用 Jersey。

    -也许他们将它硬连线到 HK2,只是不在乎 Jersey 不能用作依赖于 CDI 或 EJB 的应用程序中的插入组件

    【讨论】:

    • 它仍然是实际的错误吗?是否可以将Jersey + @EJB 注入与 Jboss 一起使用?
    【解决方案2】:

    我不知道为什么 @EJB 不起作用,但是,您可以使用 @Produces/@Disposes bean。

    @ApplicationScoped // or some other scoped
    public class MyModelProducer {
    
        @Produces public MyModel produceMyModel() {
        }
    
        public void disposeMyModel@Disposes final MyModel model) {
        }
    }
    

    【讨论】:

    • 我正在尝试遵循本教程...jersey.java.net/documentation/latest/ioc.html 但我再次得到空指针...我想知道我是否在 web.xml 配置中遗漏了某些东西...就像jax rs 无法挂钩上下文...
    • 我有一个疑问是关于 bean.xml... 是否有必要为与球衣集成的 CDI 编写一个?
    • 你能解释一下,如果在战争中 beans.xml 是强制性的,应该在哪里部署它?...我真的很生气为什么这个对象总是 null
    • 可能需要一个空的 beans.xml。在 META-INF 文件夹中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多