来自WAR的EJB中的CDI注入不保留原始对象

时间:2016-05-15 13:36:28

标签: java-ee jboss ejb jax-rs cdi

一般来说,问题是:当通过JAX-RS服务(WAR文件)中的生产者字段创建CDI bean时,CDI注入是否有效,而其消耗是在EJB bean(EJB文件)中进行的?

基于这个问题Is it possible to @Inject a @RequestScoped bean into a @Stateless EJB?这种情况应该有效,但我无法解决这个问题。

以下是一些细节。我是一个非常简单的JavaEE应用程序(https://github.com/kocherovms/develorium.com/tree/master/cdi_problem),具有以下结构:

hello-ear:
 |
 +- hello-ejb
 |   |
 |   +- HelloBean
 |
 +- hello-war
     |
     +- HelloService

在这个应用程序中,我试图通过CDI注入在JAX-RS服务(hello-war)和EJB bean(hello-ejb)之间传递一个Guest对象。以下是JAX-RS服务,它生成Guest对象的实例:

@Path("/hello")
public class HelloService {
    @EJB
    private Hello hello;

    @Produces
    @RequestScoped
    @GuestMarker
    private Guest guest;

    @GET
    public Response perform() {
        guest = new Guest();
        guest.setName("white rabbit");
        String text = hello.getHelloText();
        return Response.ok().type(MediaType.TEXT_PLAIN).entity(text).build();
    }
}

从hello-ejb实现Hello尝试通过CDI Guest使用@Inject对象:

@Stateless
public class HelloBean implements Hello {
    @Inject
    @GuestMarker
    Guest guest;

    @Override
    public String getHelloText() {
        return String.format("Hello, %s!\n", guest.getName());
    }
}

我将此应用程序部署到WildFly 10服务器中。部署本身工作正常,我的服务正在运行。但是,调用服务(curl http://localhost:8080/hello)总是返回' Hello,null!' 而不是' Hello,white rabbit!&#39 ;

这意味着Guest侧生成的HelloService对象在HelloBean内不可用,并且使用默认构造的Guest实例。 我尝试了各种范围(例如SessionScopedApplicationScoped),尝试使用生产者方法,尝试使bean成为有状态甚至是单例。什么都行不通。看来CDI总是在我的案例中使用Dependant范围。

是否可以将Guest对象的实例从HelloService传递到HelloBean

1 个答案:

答案 0 :(得分:0)

我认为你可能会使你的设置变得复杂。生产者字段被评估一次,因此您正在改变它是一个问题。你的制作人应该看起来像

@Produces
@RequestScoped
@GuestMarker
private Guest guest = new Guest();

然后只需在JAX-RS方法中调用setter,而不是实例化它。但是现在我意识到你正在使用EAR,这无法解决你的问题。 CDI bean的范围在相关的模块内。因此,EJB是它自己的上下文,不与您的JAX-RS资源共享。