Jboss Wildfly中的ClassLoading问题

时间:2014-11-13 09:55:27

标签: java-ee jboss wildfly

我正在尝试使用Java EE和JBoss WildFly创建应用程序。我已经集成了Spring Security来处理身份验证,并且我使用自定义用户详细信息服务来查找数据库中的用户详细信息。

我的EAO是用EJB模块编写的,它由web模块中的userDeailService访问。

但是当我登录时会显示以下错误。

java.lang.LinkageError: loader constraint violation: when resolving interface method "com.company.eao.UserEAO.findByUserName(Ljava/lang/String;)Lorg/springframework/security/core/userdetails/UserDetails;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, com/company/security/UserDetailServiceWrapper, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for the method's defining class, com/company/eao/UserEAO, have different Class objects for the type org/springframework/security/core/userdetails/UserDetails used in the signature 

从我读过的文章看来,似乎EJB模块类加载器和Web模块类加载器都会加载UserDetail类,发生错误。

如何指定在WildFly中使用一个类加载器,或者如何解决此问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您需要确保两个部署仅使用此库的一个版本,因为这些部署会交换其类属于此lib的对象。您可以通过将lib部署到服务器或为此lib创建wildfly模块来完成此操作。在这两种情况下,你的两个部署都必须声明对这个lib的依赖,你应该没问题。

上面提到的解决方案应该可以工作,但我个人更喜欢只使用自己创建的自定义库的JDK类或类作为数据交换类。通过这种方式,您可以减少部署的依赖性,并且在引入较新版本的库时也不会遇到麻烦......此外,您可以使用war / ear打包lib并自行传递自定义数据对象。< / p>