我有一个bean,它包含对JSF组件(确切地说是primefaces组件)的引用。
根据规范,JSF组件是不可序列化的。我的web应用程序在JBoss集群中运行,并且bean需要分发,这意味着它们需要可序列化。结果,
因此,每当我使用支持bean是带有JSF组件引用的页面时,我都会得到这个异常:
Caused by: java.lang.RuntimeException: Failure to marshal argument(s)
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.marshallCall(CommandAwareRpcDispatcher.java:257)
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.processSingleCall(CommandAwareRpcDispatcher.java:274)
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:165)
... 74 more
Caused by: org.infinispan.marshall.NotSerializableException: org.primefaces.component.fileupload.FileUpload
Caused by: an exception which occurred:
in field uploadComponent
in field bean
in object java.util.HashMap@0
in object org.jboss.as.clustering.SimpleMarshalledValue@0
in object org.infinispan.atomic.PutOperation@1fe7028
in object java.util.LinkedList@90f00d5b
in object org.infinispan.atomic.AtomicHashMapDelta@46933
in object org.infinispan.commands.write.PutKeyValueCommand@515ccf63
in object org.infinispan.commands.tx.PrepareCommand@1aaebdcd 我查看了infinispan文档,发现实际上可以通过使用AdvancedExternalizers来处理更细粒度的组件编组(包括那些没有实现Serializable的组件)。
因此,我为不可序列化的jsf组件编写了一个,如下所示:
public static class FileUploadExternalizer implements AdvancedExternalizer<FileUpload> {
private static final long serialVersionUID = 1L;
@Override
public void writeObject(ObjectOutput output, FileUpload fileUpload)
throws IOException {
}
@Override
public FileUpload readObject(ObjectInput input)
throws IOException, ClassNotFoundException {
return new FileUpload();
}
@SuppressWarnings("unchecked")
@Override
public Set<Class<? extends FileUpload>> getTypeClasses() {
return Util.<Class<? extends FileUpload>>asSet(FileUpload.class);
}
@Override
public Integer getId() {
return null;
}
}其中FileUpload是不可序列化的jsf (primefaces)组件。
对于独立的infinispan,可以使用infinispan配置的元素中的xml配置将Externalizer类注册到infinispan,如下所示:
<infinispan>
<global>
<serialization>
<advancedExternalizers>
<advancedExternalizer externalizerClass="..."/>
</advancedExternalizers>
</serialization>
</global>
...
</infinispan>问题是,当在JBoss 7容器中使用infinispan时,配置是不同的。配置在jboss7 standalone.xml (或任何其他配置xml文件)中完成。
不幸的是,在Jboss7中,无法配置元素。根据关于infinispan配置的jboss7文档,
Where is <global/>?
Much of the global configuration contains references to other JBoss AS services. In JBoss AS 7, these services are auto-injected behind the scenes. This includes things like thread pools (described below), the JGroups transport (also described below), and the mbean server.这使得我可以选择通过代码进行注册。所以我创建了一个应用程序范围的seam组件来进行注册:
@Name("infinispanExternalizerRegistration")
@Scope(ScopeType.APPLICATION)
@Startup
public class InfinispanAdvancedExternalizerRegistration {
@Create
public void init(){
GlobalConfigurationBuilder builder = new GlobalConfigurationBuilder();
builder.serialization().addAdvancedExternalizer(2345, new PhotoUploader.FileUploadExternalizer());
}
}但是,我仍然得到了这个问题开头描述的NotSerializableExceptions。这是正确的行为吗?或者是我的AdvancedExternalizer真的因为一些错误的配置而无法工作?提前感谢您的帮助。
发布于 2012-08-22 18:59:58
Cross发布到https://community.jboss.org/message/754711#754711,在那里可以看到我的答案。
https://stackoverflow.com/questions/12050631
复制相似问题