我有一个有状态的bean:
@Stateful
public class ClientContext {
private Band band;
public Band getBand() {
return band;
}
public void setBand(Band band) {
this.band = band;
}
}
我有Arquillian测试。
public class RequestTest extends Arquillian {
...
@Inject
private ClientContext context;
@Inject
private RequestProcessor processor;
@Test
public void test() {
context.setBand(new Band());
Assert.assertNotNull(context.getBand());
processor.doSomething();
}
}
和处理器代码:
@Stateless
@LocalBean
public class RequestProcessor {
...
@Inject
private ClientContext context;
public void doSomething() {
System.out.println(context.getBand());
}
}
我希望RequestProcessor打印出Band。但实际上我每次都会变为空。可能有什么不对或可能是我不能正确理解有状态豆?
答案 0 :(得分:1)
你正在回答这个问题,关于有状态的主要依据是每次注入只保留一个实例,只要注入bean就可以存活。
所以你需要在bean之间共享状态,你可以使用@SessionBean
为了澄清,@Stateful
意味着将为您注入它的每个位置创建一个实例,当您需要将某些操作及其状态绑定到一个组件时,这非常有用,因此,如果您需要创建一些信息,然后在您需要选择如何分享它的其他类之间共享:
@Singleton:整个应用程序只有一个实例。
@SessionScoped:每个客户端将有一个实例。
@Stateless:如果没有其他可用的话,将创建一个,之后它将被释放以供其他客户使用
如果您正在管理视图,您也可以使用:
@RequestScoped:将为每个请求创建一个实例,然后销毁它。
@ViewScoped:只要客户端在同一视图中继续进行更新,bean就会保持不变