CDI 注入无状态会话 Bean 请求

CDI Inject in Stateless Session Beans requests

目前我们有一个精心设计的 POJO 对象结构来处理 Web 服务请求,称为 'processor'。

远程和本地 EJB 以及在服务此请求期间调用的 PersistenceContext 在无状态 bean 中初始化并传递给此 'processors' 构造函数,该构造函数在每个 Web 服务请求期间重新创建。

如果我不想在我的 'processor' 深处恢复到 JNDI 查找,我会继续在我的代码中拖拽所有这些 EJB。

输入 CDI。我希望能够在需要时将这些 EJB 注入到 'processor'.

但是,我也注意到这意味着当前的 'processor' 本身必须成为 CDI bean:因此,在实现 web 服务的无状态会话 Bean 中使用 @Inject。

当我这样做时,处理器的整个生命周期都绑定到 bean,而不是绑定到它所服务的请求。

突然我不得不考虑到我不应该在处理器中保留状态(除了注入的对象),因为这个状态将在多个 web 服务调用之间共享。作为一名程序员,这并没有让我的生活更轻松。

那么:我应该怎么做呢?我已阅读有关范围界定的内容,但不确定这对我有何帮助/是否对我有帮助。

示例,无状态 bean:

@Stateless
@WebService
public class ExampleBean {

    @Inject
    Processor requestScopedInstance;

    int beanDependentScopeCounter;

    public String sayHello() {
        System.out.println( "bean object id: " + this.toString() );
        return requestScopedInstance.sayHello(beanDependentScopeCounter++);
    }
}

接口:

public interface Processor {

    String sayHello(int beanScopedCounter);
}

实施:

public class ProcessorImpl implements Processor {

    private int requestScopedCounter = 0;

    @Override
    public String sayHello(int beanScopedCounter) {
        return "test, requestScoped: " + requestScopedCounter++ + ", beansScoped: " + beanScopedCounter;
    }

}

When I do this the entiry lifecycle of the processor becomes bound to the bean and not to the request its serving 这是不正确的。仅当您不使用@ApplicationScoped、@SessionScoped、@RequestScoped 时才会出现这种情况。

所以:

  • @RequestScoped 注释您的处理器。
  • 您无需交出 EJB,只需在需要的地方注入即可。
  • 对使用注入对象的构造函数代码使用 @PostConstruct 注释方法。
  • 无状态 POJO 可以被注释@ApplicationScoped,无状态 POJO 不能保持依赖范围,这是默认的。

这是可能的,因为注入的是代理,而不是实际的 bean。使用这些代理 CDI 可确保将正确的范围用于您的特定调用。