首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JBoss上注册Infinispan AdvancedExternalizers为7

在JBoss上注册Infinispan AdvancedExternalizers为7
EN

Stack Overflow用户
提问于 2012-08-21 16:08:00
回答 1查看 737关注 0票数 1

我有一个bean,它包含对JSF组件(确切地说是primefaces组件)的引用。

根据规范,JSF组件是不可序列化的。我的web应用程序在JBoss集群中运行,并且bean需要分发,这意味着它们需要可序列化。结果,

因此,每当我使用支持bean是带有JSF组件引用的页面时,我都会得到这个异常:

代码语言:javascript
复制
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组件编写了一个,如下所示:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
<infinispan>
  <global>
    <serialization>
      <advancedExternalizers>
        <advancedExternalizer externalizerClass="..."/>
      </advancedExternalizers>
    </serialization>
  </global>
  ...
</infinispan>

问题是,当在JBoss 7容器中使用infinispan时,配置是不同的。配置在jboss7 standalone.xml (或任何其他配置xml文件)中完成。

不幸的是,在Jboss7中,无法配置元素。根据关于infinispan配置的jboss7文档,

代码语言:javascript
复制
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组件来进行注册:

代码语言:javascript
复制
@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真的因为一些错误的配置而无法工作?提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2012-08-22 18:59:58

Cross发布到https://community.jboss.org/message/754711#754711,在那里可以看到我的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12050631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档