0

我有一个有状态的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 打印出乐队。但实际上我每次都为空。什么可能是错误的,或者我可能没有正确理解有状态的 bean?

4

1 回答 1

1

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

于 2014-10-16T00:36:38.120 回答