我有无状态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.
答案 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
,而只适用于@Singleton
或Stateful
,原因很明显。