【问题标题】:Unable to deploy Spring Ws on WAS 8 - class conflicts?无法在 WAS 8 上部署 Spring Ws - 类冲突?
【发布时间】:2015-09-24 20:47:08
【问题描述】:

我正在尝试使用以下配置在 WAS 8 上部署 Spring-Ws 应用程序:

Web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/xxx-servlet.xml</param-value>
</context-param>

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>xxx-services</servlet-name>
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    <init-param>
        <param-name>transformWsdlLocations</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>xxx-services</servlet-name>
    <url-pattern>/endpoints/*</url-pattern>
</servlet-mapping>

<resource-ref>
    <description>MGI Data Source</description>
    <res-ref-name>jdbc/xxxDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Spring-Context.xml

<sws:annotation-driven />

<context:component-scan
    base-package="com.xxx.webservices.endpoints,com.xxx.webservices.service,com.xxx.webservices.dao" />


<bean id="validatingInterceptor"
    class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
    <property name="schemas">
        <list>
            <value>WEB-INF/classes/schemas/CodeDetails.xsd</value>
            <value>WEB-INF/classes/schemas/GetAccountRangeConfig.xsd</value>
            <value>WEB-INF/classes/schemas/GetCABExceptionTerms.xsd</value>
            <value>WEB-INF/classes/schemas/SaveAccountRangeConfig.xsd</value>
        </list>
    </property>
    <property name="validateRequest" value="true" />
</bean>

<bean id="testService"
    class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"
    lazy-init="true">
    <property name="schemaCollection">
        <bean
            class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
            <property name="inline" value="true" />
            <property name="xsds">
                <list>
                    <value>WEB-INF/classes/schemas/CodeDetails.xsd</value>
                    <value>WEB-INF/classes/schemas/GetAccountRangeConfig.xsd</value>
                    <value>WEB-INF/classes/schemas/GetCABExceptionTerms.xsd</value>
                    <value>WEB-INF/classes/schemas/SaveAccountRangeConfig.xsd</value>
                </list>
            </property>
        </bean>
    </property>
    <property name="portTypeName" value="TestService" />
    <property name="serviceName" value="TestService" />
    <property name="locationUri"
        value="/endpoints" />
</bean>

<bean id="exceptionResolver"
    class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver">
    <property name="defaultFault" value="SERVER" />
    <property name="exceptionMappings">
        <value>
            org.springframework.oxm.ValidationFailureException=CLIENT,Invalid Request
        </value>

    </property>
</bean>

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/xxxDB"/>
</bean>

当我构建这个 WAR 文件并将其部署到 WAS 8 上时,我收到以下错误消息:

SourceId: org.springframework.web.context.support.XmlWebApplicationContext.org.springframework.context.support.AbstractApplication

上下文.刷新 ExtendedMessage:上下文初始化期间遇到异常-取消刷新尝试org.springframework.beans.factory .BeanCreationException:创建名为“org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection#0”的bean时出错:调用 初始化方法失败;嵌套异常是 java.lang.NoSuchMethodError: org/apache/ws/commons/schema/XmlSchemaCollection.read(Lorg/ xml/sax/InputSource;)Lorg/apache/ws/commons/schema/XmlSchema; 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.j 爱娃:1553) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.jav 一个:539) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java: 475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:72 5) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:7 57) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1704) 在 com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:411) 在 com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:88) 在 com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:169) 在 com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:749) 在 com.ibm.ws.webcontainer.WSWebContainer.addWebApplication(WSWebContainer.java:634) 在 com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:426) 在 com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:718) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1177) 在 com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1370) 在 com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:639) 在 com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:968) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:776) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplicationDynamically(ApplicationMgrImpl.java:1379) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2189) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:435) 在 com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:378) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access 500 美元(CompositionUnitMgrImpl.java:126) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl$1.run(CompositionUnitMgrImpl.java:653) 在 com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:5477) 在 com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:5603) 在 com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.startCompositionUnit(CompositionUnitMgrImpl.java:667) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.startCompositionUnit(CompositionUnitMgrImpl.java:611) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:1269) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 在 java.lang.reflect.Method.invoke(Method.java:620) 在 sun.reflect.misc.Trampoline.invoke(MethodUtil.java:88) 在 sun.reflect.GeneratedMethodAccessor48.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 在 java.lang.reflect.Method.invoke(Method.java:620) 在 sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:292) 在 javax.management.modelmbean.RequiredModelMBean$4.run(RequiredModelMBean.java:1261) 在 java.security.AccessController.doPrivileged(AccessController.java:311) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:88) 在 javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1255) 在 javax.management.modelmbean.RequiredModelMBean.invoke(RequiredModelMBean.java:1093) 在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:832) 在 com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:814) 在 com.ibm.ws390.management.connector.corba.CorbaConnectorImpl.invoke(CorbaConnectorImpl.java:1073) 在 com.ibm.ws390.management.connector.corba._CorbaConnectorImplBase._invoke(_CorbaConnectorImplBase.java:416) 在 com.ibm.ws390.orb.CommonBridge.invoke(CommonBridge.java:1898) 在 com.ibm.ws390.orb.CommonBridge.getAndProcessWork(CommonBridge.java:725) 在 com.ibm.ws390.orb.CommonBridge.runApplicationThread(CommonBridge.java:614) 在 com.ibm.ws.util.ThreadPool$ZOSWorker.run(ThreadPool.java:2116) 引起:java.lang.NoSuchMethodError: org/apache/ws/commons/schema/XmlSchemaCollection.read(Lorg/xml/sax/InputSource;)Lorg/apache/ ws/commons/schema/XmlSchema; 在 org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection.afterPropertiesSet(CommonsXsdSchemaCollection.java:140) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactor y.java:1612) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.j 爱娃:1549) ... 60 更多

我搜索了 StackOverFlow,花了很多时间在 Google 中研究这个问题,并尝试将类加载策略更改为 Parent Last,但我仍然遇到同样的错误。这是我的 WEB-INF/lib 中的 JAR 列表:

aopalliance-1.0.jar
commons-dbcp-1.2.2.jar
commons-logging-1.1.3.jar
commons-pool-1.3.jar
jaxb-api-2.2.12.jar
jaxb-core-2.2.11.jar
jaxb-impl-2.2.11.jar
log4j-1.2.17.jar
ojdbc6-11.2.0.jar
spring-aop-4.1.0.RC2.jar
spring-beans-4.1.0.RC2.jar
spring-context-4.1.0.RC2.jar
spring-context-support-4.1.0.RC2.jar
spring-core-4.1.0.RC2.jar
spring-expression-4.1.0.RC2.jar
spring-jdbc-4.1.0.RC2.jar
spring-oxm-4.1.0.RC2.jar
spring-secutiry-core-3.2.5.RELEASE.jar
spring-tx-4.0.9.RELEASE.jar
spring-web-4.1.0.RC2.jar
spring-webmvc-4.1.0.RC2.jar
spring-ws-core-2.2.1.RELEASE.jar
spring-ws-security-2.2.1.RELEASE.jar
spring-ws-test-2.2.1.RELEASE.jar
spring-xml-2.2.1.RELEASE.jar
xmlschema-core-2.2.1.RELEASE.jar
xmlunit-1.5.jar

有没有人遇到过这个问题?任何帮助将不胜感激。我应该删除任何其他 JAR 吗?我错过了什么吗?

我什至尝试过 mvn dependency:tree -Dverbose=true -Dincludes=org.apache.ws.xmlschema:xmlschema-core:: 但什么也没出现 :(

【问题讨论】:

  • 将类加载切换到最后一个父类,这样您的 web-inf/lib 目录将在应用服务器的类之前被查询。
  • 我已经尝试过了,但我仍然遇到同样的错误。我应该做其他设置吗?
  • 对于初学者,我会修复混合不同版本的 spring jar(4.0.9 和 4.1.0.RC2),为什么你不使用最终版本,而是使用一些 beta 版本?您的 JAXB 版本似乎也不匹配(您也不应该需要 JAXB,因为它是 JDK 的一部分)。您可能还想将 xmlschema 降级到 2.2.0 并使用完整的 xmlschema jar 而不仅仅是核心。
  • 我已更新我的 pom.xml 以使用最新的 Spring JAR。但我不确定为什么 Maven 没有选择最新的 spring-tx。我没有手动声明它,它可能是其他 spring JAR 依赖项的一部分。此外,在将 xmlschema-core-2.2.1.RELEASE.jar 移动到共享库后,我的代码现在可以工作了。非常感谢!!!

标签: spring spring-ws


【解决方案1】:

IBM WAS 有自己的类org.apache.ws.commons.schema.XmlSchemaCollection 实现,位于随 WAS 提供的众多 jar 之一中。 为了防止 WAS 加载没有必要方法 read() 的第一类 XmlSchemaCollection,您应该使用自己的 xmlschema-core-2.2.1.RELEASE.jar(在版本 2.2.1 中,类 XmlSchemaCollection 肯定需要 read() 方法)作为IBM WAS 共享库。 您可以设置共享库并将其连接到 WAS 管理控制台中的 Web 应用程序。 它会解决你的问题。

【讨论】:

  • 将 xmlschema-core-2.2.1.RELEASE.jar 从 WEB-INF/lib 移动到共享库解决了这个问题。非常感谢德米特里!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多