NotSerializableException с валидатором Primefaces/Omnifaces в Jboss EAP 6.3 в кластере режимов

Я пытаюсь использовать валидатор Omnifaces в следующих строках кода внутри составного компонента:

<p:inputText id="#{cc.attrs.id}" size="12" maxlength="10" value="#{cc.attrs.holder.idHolderPk}"
    label="#{cc.attrs.label}" styleClass="content-right"
    disabled="#{not empty cc.attrs.disabled?cc.attrs.disabled:false}">
    <f:validator disabled="#{!cc.attrs.required}" validatorId="#{cc.attrs.validatorName}"/>
    <o:validator disabled="#{empty cc.attrs.beanValidation ? true : false}" validatorId="javax.faces.Bean" validationGroups="#{cc.attrs.beanValidation}"/>
    <p:ajax event="blur" listener="#{holderHelperBean.findHolder()}"
        process="@this" update="outpnlHolder"
        oncomplete="#{not empty cc.attrs.remoteListener ? cc.attrs.remoteListener : ''}"/>
    <pe:keyFilter mask="pint"/>
</p:inputText>

Но я получаю следующую ошибку:

ERROR [org.infinispan.transaction.TransactionCoordinator] (ajp-118)     
ISPN000097: Error while processing a prepare in a single-phase transaction: org.infinispan.CacheException: java.lang.RuntimeException: Failure to marshal argument(s)
    at org.infinispan.util.Util.rewrapAsCacheException(Util.java:542)[0m
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:186)[0m
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.invokeRemotely(JGroupsTransport.java:515)[0m
    at org.infinispan.remoting.rpc.RpcManagerImpl.invokeRemotely(RpcManagerImpl.java:173)
    at org.infinispan.remoting.rpc.RpcManagerImpl.invokeRemotely(RpcManagerImpl.java:194)
    at org.infinispan.remoting.rpc.RpcManagerImpl.invokeRemotely(RpcManagerImpl.java:251)
    at org.infinispan.remoting.rpc.RpcManagerImpl.invokeRemotely(RpcManagerImpl.java:238)
    at org.infinispan.remoting.rpc.RpcManagerImpl.invokeRemotely(RpcManagerImpl.java:233)
Caused by: java.lang.RuntimeException: Failure to marshal argument(s)
Caused by: org.infinispan.marshall.NotSerializableException: org.omnifaces.taghandler.Validator

Я использую Jboss 6.3 EAP в кластере режима с репликацией сеанса, Omnifaces 1.8.1, Primefaces 4.0.13, Mojarra 2.1.28-jbossorg-5.

Я использую o:validator для проверки бина, потому что мне нужно динамическое отключение и визуализация проверки

Когда приложение находится в автономном режиме, работает нормально, без сообщения об ошибке.

1 ответ

Решение

Ввод <o:validator> прямо внутри <cc:implementation> имел из-за логической ошибки нежелательный побочный эффект, связанный с добавлением нового экземпляра валидатора во время ответа рендеринга обратной передачи (поскольку ожидалось, что <o:validator> был вложен внутрь <my:composite> с for атрибуты). JSF заметил это динамическое изменение и хотел сохранить его в состоянии просмотра JSF, чтобы его можно было восстановить при следующей обратной передаче, но он не был сериализуем и, следовательно, это исключение.

Исправление состояло в том, чтобы просто не прикреплять его вообще, когда он уже находится непосредственно в составном компоненте. Это будет в OmniFaces 2.1.

Другие вопросы по тегам