GWT + Guava + JBoss:调度传入RPC调用时的类加载器异常

时间:2013-08-13 10:57:25

标签: exception gwt jboss guava rpc

我已经设置了一个部署到JBoss服务器的GWT应用程序,并且(通常)根据需要执行。它基于Maven,分为服务器和Web模块。自从我最近被介绍到Guava库以来,由于它的GWT兼容性,我决定将它包含在我的项目中。

尝试从服务器向Web发送Guava类的可选对象时,我不幸地忍受了jBoss控制台上出现的以下错误消息:

  

调度传入的RPC调用时发生异常:

     

com.google.gwt.user.server.rpc.UnexpectedException:服务方法'public abstract com.google.common.base.Optional com.company.project.client.rpc.ProjectService.getSearchWords(java.lang.String )'抛出一个意想不到的例外:

     

java.lang.LinkageError:加载器约束违规:解析接口方法时“com.company.project.service.ProjectController.getSearchWords(Ljava / lang / String;)Lcom / google / common / base / Optional;”

     

当前类的类加载器(org / jboss / modules / ModuleClassLoader的实例),com / company / project / server / ProjectServlet,以及用于已解析类的类加载器(org / jboss / modules / ModuleClassLoader的实例) ,com / company / project / service / ProjectController,具有类型为va / lang / String的不同Class对象;)Lcom / google / common / base / Optional;用于签名

这是ProjectService.java文件中包含的行:

Optional<Set<String>> getSearchWords( String token );

ProjectController.java中的模拟方法签名(它是ProjectControllerBean.java的接口)看起来是一样的。

此问题仅与Guava类“Optional”一起发生。任何其他RPC方法都可以正常工作。

有没有人知道可能会发生什么以及如何解决这个问题?我真的很高兴得到任何帮助!

提前致谢。

编辑#1

我想这可能与jboss提供可能通过ModuleClassLoader加载的Guava库的过时版本有关。但不幸的是,我一直无法通过jboss-deployment-structure.xml禁用该自动化:(

我将该文件放入我的EAR的src / main / application中,其中包含以下内容:

<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="com.google.guava" />
        </exclusions>
    </deployment>

    <sub-deployment name="project-server.jar">
        <exclusions>
            <module name="com.google.guava" />
        </exclusions>
    </sub-deployment>
</jboss-deployment-structure>

1 个答案:

答案 0 :(得分:0)

jboss-deployment-structure.xml必须是EAR的META-INF目录。如果您的maven项目,它应该在src/main/resources/META-INF目录中。