CDI 注入无状态会话 Bean 请求

问题描述 投票:0回答:1

目前我们有一个复杂的 POJO 对象结构来处理 Web 服务请求,称为“处理器”。

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

如果我不想在我的“处理器”深处恢复 JNDI 查找,我会继续通过我的代码拖动所有这些 EJB。

输入 CDI。我希望能够在需要时将这些 EJB 注入到这个“处理器”中。

但是,我也注意到这意味着当前的“处理器”本身必须成为 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;
    }

}
java web-services jakarta-ee cdi stateless-session-bean
1个回答
3
投票

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 可确保您的特定调用使用正确的范围。

© www.soinside.com 2019 - 2024. All rights reserved.