mdo*_*ust 2 java spring web-services spring-ws java-ee
我已经实现了一个Spring Web Service Server和Client,其配置如下。
我选择使用simplePasswordSecurity机制,并且两侧都已安装好以处理此问题。到目前为止,我可以将请求从客户端发送到服务器,服务器将处理该请求并将响应发送回去。
在我的终端日志中,我可以看到客户端收到了响应,但是我无意中得到了这个异常:
java.lang.AbstractMethodError: org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor.afterCompletion(Lorg/springframework/ws/context/MessageContext;Ljava/lang/Exception;)V
at org.springframework.ws.client.core.WebServiceTemplate.triggerAfterCompletion(WebServiceTemplate.java:806)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:615)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
Run Code Online (Sandbox Code Playgroud)
....
有什么想法为什么我会得到这个例外?
<bean id="FinancialService" 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>schemas/FinancialServiceOperations.xsd</value>
</list>
</property>
</bean>
</property>
<property name="portTypeName" value="FinancialService" />
<property name="serviceName" value="FinancialService" />
<property name="locationUri" value="/endpoints" />
</bean>
<sws:interceptors>
<bean id="authenticationInterceptor" class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
<property name="policyConfiguration" value="/WEB-INF/spring-security.xml" />
<property name="callbackHandlers">
<list>
<bean id="passwordValidationHandler" class="org.springframework.ws.soap.security.xwss.callback.SimplePasswordValidationCallbackHandler">
<property name="users">
<props>
<prop key="myUser">myPassword</prop>
</props>
</property>
</bean>
</list>
</property>
</bean>
</sws:interceptors>
Run Code Online (Sandbox Code Playgroud)
<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config" dumpMessages="true">
<xwss:RequireUsernameToken passwordDigestRequired="false" nonceRequired="false"/>
</xwss:SecurityConfiguration>
Run Code Online (Sandbox Code Playgroud)
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
<bean id="soapMessageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
<property name="soapVersion">
<util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_11" />
</property>
</bean>
<oxm:jaxb2-marshaller id="marshaller" context-path="com.example.domain.service.financial.stub" />
<bean id="financialWebServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="soapMessageFactory" />
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="marshaller" />
<property name="defaultUri" value="http://localhost:8080/financial/FinancialService.wsdl" />
<property name="messageSender" ref="xwsSecurityMessageSender" />
<property name="interceptors">
<list>
<ref bean="xwsSecurityInterceptor" />
</list>
</property>
</bean>
<bean id="xwsSecurityMessageSender" class="org.springframework.ws.transport.http.CommonsHttpMessageSender" />
<bean id="xwsSecurityInterceptor" class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
<property name="policyConfiguration" value="/WEB-INF/spring-ws-security.xml" />
<property name="callbackHandlers">
<list>
<ref bean="xwsSecurityCallbackHandler" />
</list>
</property>
</bean>
<bean id="xwsSecurityCallbackHandler" class="org.springframework.ws.soap.security.xwss.callback.MockValidationCallbackHandler" />
Run Code Online (Sandbox Code Playgroud)
<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config" dumpMessages="true">
<xwss:UsernameToken name="myUser" password="myPassword" digestPassword="false" useNonce="false"/>
</xwss:SecurityConfiguration>
Run Code Online (Sandbox Code Playgroud)
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
INFO: ==== Sending Message Start ====
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="XWSSGID-140733907019228719200">
<wsse:Username>willapweb</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">****</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns2:OnlinePaymentFormRequest xmlns:ns2="http://com/example/ws">
<ns2:serial>c3hqvk9dejps923m01qrpqrh6f</ns2:serial>
<ns2:amount>200000</ns2:amount>
</ns2:OnlinePaymentFormRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
==== Sending Message End ====
INFO: ==== Received Message Start ====
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="XWSSGID-140733907019228719200">
<wsse:Username>willapweb</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">****</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns2:OnlinePaymentFormRequest xmlns:ns2="http://com/example/ws">
<ns2:serial>c3hqvk9dejps923m01qrpqrh6f</ns2:serial>
<ns2:amount>200000</ns2:amount>
</ns2:OnlinePaymentFormRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
==== Received Message End ====
INFO: ==== Sending Message Start ====
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:OnlinePaymentFormResponse xmlns:ns2="http://com/example/ws">
<ns2:message>{"form":"<form action='https://bank.om/Payment.aspx' method='post' id='bank-form'><input type='hidden' name='Amount' value='200000'/><input type='hidden' name='MID' value='12'/><input type='hidden' name='ResNum' value='c3hqvk9dejps923m01qrpqrh6f'/><input type='hidden' name='RedirectURL' value='http://130.185.73.133/payment/verification'/><\/form>","successful":true}</ns2:message>
</ns2:OnlinePaymentFormResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
==== Sending Message End ====
INFO: ==== Received Message Start ====
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:OnlinePaymentFormResponse xmlns:ns2="http://com/example/ws">
<ns2:message>{"form":"<form action='https://bank.com/Payment.aspx' method='post' id='bank-form'><input type='hidden' name='Amount' value='200000'/><input type='hidden' name='MID' value='12'/><input type='hidden' name='ResNum' value='c3hqvk9dejps923m01qrpqrh6f'/><input type='hidden' name='RedirectURL' value='http://130.185.73.133/payment/verification'/><\/form>","successful":true}</ns2:message>
</ns2:OnlinePaymentFormResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
==== Received Message End ====
Run Code Online (Sandbox Code Playgroud)
您很可能在类路径中有不兼容的JAR。
AbstractMethodError
AbstractMethodError 是当应该存在的方法实际上不存在时,JVM引发的运行时错误。
这不应在您自己的代码中发生:编译器阻止您调用不存在的方法。
但是,当使用外部JAR(取决于其他外部JAR)时,编译器无法警告您。
假设我有A-1.0.jar,其中包含类A,该类具有method doStuffV1()。
然后,A-2.0.jar包含对类A的更新,该类添加了另一个方法doStuffV2()。最后,假设我有B-2.0.jar,它是用A-2.0.jar编译的,并且类B扩展了A。
在您的项目中,如果仅导入B-2.0.jar,并且使用类B并调用doStuffV2,则编译器不会抱怨:您使用的是有效的类。
但是,如果在运行时抛出类路径A-1.0.jar和B-2.0.jar,则在执行代码时将得到AbstractMethodError:编译B-2.0.jar时存在的内容在运行时不存在。这是崩溃。
应用于Spring WS Jars 2.0.0至2.2.0
在Spring WS中,如果查看所引用的Spring WS 2.0.0 Javadoc,则可以在此处(http://docs.spring.io/spring-ws/sites/2.0/apidocs/index.html)中看到afterCompletion签名:
public void afterCompletion(MessageContext messageContext,Object端点,Exception ex)
但是,如果您查看2.2.0 api(http://docs.spring.io/spring-ws/docs/2.2.0.RELEASE/api/),则确实存在相同的方法,只是签名不同。对于Java编译器和运行时,这是不同的方法:
public void afterCompletion(MessageContext messageContext,Exception ex)引发WebServiceClientException
来自堆栈跟踪的信息
您的堆栈跟踪表明WSTemplate类中的运行时试图调用更高版本(请参见第一行)。
java.lang.AbstractMethodError:... XwsSecurityInterceptor.afterCompletion(Lorg / springframework / ws / context / MessageContext; Ljava / lang / Exception;)V at org ... WebServiceTemplate.triggerAfterCompletion(WebServiceTemplate.java:806)
这向我表明1.您有一个Spring-WS-Core(WebServiceTemplate.class),它是2.2.0版本2.带有Spring WS Security(XwsSecurityInterceptor),它是2.1.0版本(或介于两者之间) 。
那是不兼容的。您应该使两个版本保持同步。
编辑:与您的POM,似乎已确认。
| 归档时间: |
|
| 查看次数: |
6727 次 |
| 最近记录: |