如何在无状态bean中注入ApplicationScoped bean?

时间:2015-11-20 12:53:23

标签: jsf ejb

我有无状态bean调用异步操作。我想向这个bean注入另一个bean,它存储(或者应该存储)运行进程状态。这是我的代码:

处理器:

@Stateless
public class Processor {

    @Asynchronous
    public void runLongOperation() {
        System.out.println("Operation started");
        try {
            for (int i = 1; i <= 10; i++) {
                //Status update goes here...
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
        }
        System.out.println("Operation finished");
    }

}

ProcessorHandler:

@ManagedBean(eager = true, name="ph")
@ApplicationScoped
public class ProcessorHandler implements RemoteInterface {

    public String status;

    @EJB
    private Processor processor;

    @PostConstruct
    public void init(){
        status = "Initialized";
    }

    @Override
    public void process() {
        processor.runLongOperation();
    }

    public String getStatus() {
        return status;
    }


}

ProcessHandler的处理方法绑定到一个按钮。 我想从Processor内部修改ProcessHandler bean的状态,这样我就可以向用户显示更新状态。

我尝试使用@ Inject,@ ManagedProperty和@EJB注释,但没有成功。

我正在使用Eclipse EE开发的Websphere v8.5上测试我的产品。

向Processor类添加注入时...

@Inject
public ProcessorHandler ph;

我收到了错误:

The @Inject java.lang.reflect.Field.ph reference of type ProcessorHandler for the <null> component in the Processor.war module of the ProcessorEAR application cannot be resolved.

1 个答案:

答案 0 :(得分:3)

您应该从不在服务层(EJB)中拥有任何特定于客户端的工件(JSF,JAX-RS,JSP / Servlet等)。它使服务层在不同的客户端/前端之间不可用。

只需将private String status字段移到EJB中,因为它实际上是负责管理它的人。

@ManagedBean(eager = true, name="ph")
@ApplicationScoped
public class ProcessorHandler implements RemoteInterface {

    @EJB
    private Processor processor;

    @Override
    public void process() {
        processor.runLongOperation();
    }

    public String getStatus() {
        return processor.getStatus();
    }

}

请注意,这不仅适用于@Stateless,而只适用于@SingletonStateful,原因很明显。