在Mojarra和MyFaces中,Viewscoped bean状态保持不同

时间:2013-11-25 12:30:34

标签: java multithreading jsf myfaces mojarra

我有一个视图,你可以开始一个昂贵的过程。视图与@ViewScoped bean配对,如果进程启动,则会定期使用PrimeFaces检查状态。我有以下Runnable,它通过昂贵的操作调用Web服务。

public class Generator extends AsyncCaller {

    private Viewer bean;
    private String id;

    public Generator(Viewer bean, Client client, String id) {
        super(client);
        this.bean = bean;
        this.id = id;
    }

    @Override
    public void run() {
        ClientResponse response = getClient().generate(this.id); 

        boolean error =
(response.getClientResponseStatus().getFamily() != Family.SUCCESSFUL);
        if (error) {
            Exception e = new UniformInterfaceException(response);
            this.bean.setGenerateException(e);
        }
        this.bean.setGenerateError(error);
    }

}

我将此Runnable作为单独的Thread启动,因此不会阻止用户界面。正如您所看到的,我将视图范围的托管bean实例传递给Runnable,因此如果出现错误,我可以在bean中设置它,然后在UI上显示它。

我的问题是,使用Mojarra 2.1.6和2.1.26这样可以正常工作,但是我希望使用MyFaces 2.1.13 - generateError变量永远不会true bean,虽然我可以在调试中看到setGenerateError(true)。与视图一起使用的实际bean与可从线程访问的bean实例不同。我实际上可以在调试中看到这一点:使用MyFaces,每个轮询请求都会产生一个新的视图范围bean实例,而使用Mojarra时,它总是相同的实例。

我错过了MyFaces中的<context-param />设置吗?根据规范,哪一个实际上是正确的行为?

1 个答案:

答案 0 :(得分:2)

OmniFaces showcase's web.xml中找到答案:

<context-param>
    <!-- MyFaces and Mojarra don't agree on the default setting for actually 
        serializing state in the session as opposed to just storing a reference. 
        Mojarra's default is false, but can be switched to true. MyFaces' default 
        is true, and can be switched to false, which we thus do below. See http://arjan-tijms.omnifaces.org/p/jsf-22.html#1127 -->
    <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
    <param-value>false</param-value>
</context-param>