使用spring-ws客户端时,Jboss中的Spring类加载器问题

时间:2010-12-27 23:03:58

标签: spring jboss classpath classloader spring-ws

我的应用程序在Jboss中正常运行。为了编写spring webservice客户端,我使用wsimport生成了类。我在配置中写了以下内容

 <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
<property name="messageFactory">
    <bean class="com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"/>
</property>

                                                                                                                                        在jboss?lib我有jboss-jaxws.jar,spring.jar ...现在我复制了

spring-ws-1.5.0.jar and  saaj-impl-1.3.jar

但是我遇到了以下错误:

The Spring ContextLoaderListener we wrap threw on contextInitialized.
But for our having caught this error, the web application context would not have initialized.
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.lang.IllegalArgumentException: Class [org.apache.xbean.spring.context.v2.XBeanNamespaceHandler] does not implement the NamespaceHandler interface
Caused by: 
java.lang.IllegalArgumentException: Class [org.apache.xbean.spring.context.v2.XBeanNamespaceHandler] does not implement the NamespaceHandler interface
    at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.initHandlerMappings(DefaultNamespaceHandlerResolver.java:119)

请帮我解决此错误。这些错误只有在保留这些罐子后才能得到。但这些都需要运行我的新代码。请建议我如何避免它们?

2 个答案:

答案 0 :(得分:2)

这告诉我,您的CLASSPATH中有两个版本的JAR - 可能是服务器本身的一个版本,另一个是应用程序的一部分 - 它们不是同一个版本。在应用程序类加载器运行之前,服务器类加载器将首先找到服务器版本。如果它是您的应用程序所需的早期版本,那么您将遇到问题。

解决方案很难,因为您可能无法在不破坏其他已部署应用的情况下删除服务器版本。查看应用程序的JBOSS配置中是否有一个标志,告诉JBOSS更喜欢应用程序类加载器加载的JAR,看看是否有帮助。

http://www.datadisk.co.uk/html_docs/java_app/jboss5/jboss5_deployment.htm http://community.jboss.org/wiki/ClassLoadingConfiguration http://community.jboss.org/wiki/JBossClassLoadingUseCases

答案 1 :(得分:1)

您可以使用下一个内容为您的应用程序创建WEB-INF / jboss-web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
    "-//JBoss//DTD Web Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>
    <class-loading java2ClassLoadingCompliance="false">
        <loader-repository>
                   myapp:loader=anyUniqueName
            <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
        </loader-repository>
    </class-loading>
</jboss-web>

这可以防止类加载器查找JBoss库。作为缺点,您必须在WAR / lib文件夹中提供所有第三方jar。

这适用于4.2您可以查找与您当前使用的版本类似的内容。