有状态的豆不会保持状态

时间:2014-10-15 15:08:56

标签: java java-ee ejb jboss-arquillian stateful-session-bean

我有一个有状态的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。但实际上我每次都会变为空。可能有什么不对或可能是我不能正确理解有状态豆?

1 个答案:

答案 0 :(得分:1)

你正在回答这个问题,关于有状态的主要依据是每次注入只保留一个实例,只要注入bean就可以存活。 所以你需要在bean之间共享状态,你可以使用@SessionBean 为了澄清,@Stateful意味着将为您注入它的每个位置创建一个实例,当您需要将某些操作及其状态绑定到一个组件时,这非常有用,因此,如果您需要创建一些信息,然后在您需要选择如何分享它的其他类之间共享: @Singleton:整个应用程序只有一个实例。 @SessionScoped:每个客户端将有一个实例。 @Stateless:如果没有其他可用的话,将创建一个,之后它将被释放以供其他客户使用 如果您正在管理视图,您也可以使用: @RequestScoped:将为每个请求创建一个实例,然后销毁它。 @ViewScoped:只要客户端在同一视图中继续进行更新,bean就会保持不变