首页 > 解决方案 > 集群中的 Wildfly 10 尝试使用 org.infinispan.commons.marshall.NotSerializableException 序列化 JSP

问题描述

我正在尝试将我的应用程序与 JPS 中的以下代码一起使用

<c:forEach var="area" items="#{MissingSearchBean.workingAreas}">
     <h:commandButton value="#{area.workingAreaName}(#{area.count})"
                         action="#{MissingSearchBean.selectWorkingArea(area.workingAreaName)}"
                         styleClass="commandButton" />
</c:forEach>

在 wifly 10 里面。一切正常,但是当我打开视图时,包含上面的代码,我在日志中看到以下错误:

Caused by: org.infinispan.commons.marshall.NotSerializableException: javax.servlet.jsp.jstl.core.IteratedExpression
Caused by: an exception which occurred:
    in field iteratedExpression
    in field delegate
    in field savedState
    in field m
    in object java.util.HashMap@85e645ff
    in object org.wildfly.clustering.marshalling.jboss.SimpleMarshalledValue@85e645ff

我认为 wildfly 会尝试将视图持久化到 infinispan 以便能够恢复视图,以防我重新加载页面或在另一个节点上点击此页面。

我试图将 bean 的范围更改为request甚至更改为none,但 wildfly 仍然尝试序列化视图。我绝对确定问题出在了,c:forEach因为当我将其(以及它的内容)注释掉时——我没有得到任何例外。

里面也明显IteratedExpression包含Iterator,这是不Serializable正确的。

我正在寻找任何解决方案/解决方法,以便能够在集群中工作而不会引发异常。

标签: wildflywildfly-10infinispan

解决方案


问题是c:forEach创建IteratedValueExpression,这不是Serializable因为包含Iterator内部。简单的解决方法是将返回类型更改MissingSearchBean.workingAreas为数组。

如果 whenvalue由数组表示,则LoopTagSupport创建IndexedValueExpression而不是IteratedValueExpression并且 this 是显式的Serializable


推荐阅读