JSF 2 Ajax 侦听器未在 WebSphere 集群环境中调用

JSF 2 Ajax listener not invoked on WebSphere Cluster Environment

我们使用 JSF 2.0.3 版本和 WebSpehere 8.5 作为应用程序服务器。由于我们公司的限制,我们需要有两个能够在两个 boxes.Please 注释之间移动数据的 selectmanylistboxes 我不能使用 Rich faces,Ice faces 等。因此我尝试使用 Ajax 调用和监听器下面的代码移动数据

    <h:commandButton id="lefttoright"  value="Left to Right"  >
 <f:ajax execute="listbox" render="sellistbox listbox" onevent="checkData"  listener="#{bean.leftToRight}" />
</h:commandButton> 

请注意我使用的是 Viewscoped bean。现在,在使用单节点单服务器 WebSphere 设置的本地 RAD 上,在框周围移动数据的功能非常好。

当我在我们的 WeSphere 服务器上部署相同的代码时,该服务器有 1 个单元,2 个节点,每个节点有 2 个服务器,每个服务器都在集群中,"left to Right" 按钮只调用构造函数但不调用方法,即 "leftToRight"。在调用 "lefttoright" 按钮时,日志中没有直接报告 errors/exceptions。但是关于序列化有一个连续的异常被抛出。不确定这是否对 Ajax 调用有任何直接影响。

 E SessionContextMBeanAdapter findAttCausingNotSerializableException Miscellaneous data: Attribute "com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap" is declared to be serializable but is found to generate exception "java.io.NotSerializableException" with message "com.sun.faces.context.FacesContextImpl".  Fix the application so that the attribute "com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap" is correctly serializable at runtime.

非常感谢任何反馈。如果我需要提供更多信息,请告诉我。

"java.io.NotSerializableException" with message "com.sun.faces.context.FacesContextImpl"
Fix the application so that the attribute "com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap" is correctly serializable at runtime

所以,你有这样的东西:

@ViewScoped
public class Bean implements Serializable {

    private FacesContext context = FacesContext.getCurrentInstance();

    // ...
}

这绝对是不对的。你永远不应该将 FacesContext 指定为某个 class 的实例变量,它的寿命比 FacesContext 实例本身长。

改为在方法局部范围内获取它,不要将它分配给任何实例变量。

@ViewScoped
public class Bean implements Serializable {

    public void someMethod() {
        FacesContext context = FacesContext.getCurrentInstance();
        // ...
    }

    // ...
}

这样,代表 JSF 视图状态本身的 LogicalViewMap 将再次变为可序列化,并且任何依赖于 JSF 视图状态的东西都将再次开始工作,例如 ajax 请求,它依赖于查看作用域变量。

只有在即将到来的 JSF 2.3 中,将它作为实例变量才是合法的,前提是它是通过 CDI 注入的(CDI 将像往常一样只是注入一个可序列化的 proxy,进一步委托给当前可用的实例).

@ViewScoped
public class Bean implements Serializable {

    @Inject
    private FacesContext context;

    // ...
}

另请参阅:

  • Lifecycle of FacesContext?

根据进一步分析,此问题的根本原因是常见的日志记录 jar 被添加到 lib 文件夹中,并且在删除 jar 文件后所有 ajax 调用开始工作,没有任何问题。根据我痛苦的经历,如果您遇到任何奇怪的问题,我建议您检查 jar 文件,尤其是 "common logging" :)。检查下面 link 以供参考 http://articles.qos.ch/thinkAgain.html