Java SpringWeb服务客户端XwsSecurityInterceptor完成后异常

Java SpringWeb服务客户端XwsSecurityInterceptor完成后异常,java,spring,web-services,jakarta-ee,spring-ws,Java,Spring,Web Services,Jakarta Ee,Spring Ws,我已经实现了一个SpringWeb服务服务器和客户端,配置如下 我选择了使用simplePasswordSecurity机制,两边都安装了相应的装置。到目前为止,我可以将我的请求从客户端发送到服务器,服务器将处理该请求并发送回响应 在我的终端日志中,我可以看到客户端接收到响应,但不知从哪里我得到了这个异常: java.lang.AbstractMethodError: org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor

我已经实现了一个SpringWeb服务服务器客户端,配置如下

我选择了使用
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)

你知道我为什么会得到这个例外吗?


服务器 spring-config.xml

schemas/FinancialServiceOperations.xsd
我的密码
spring-security.xml

pom.xml

org.springframework.ws
SpringWS核心
2.0.0.1版本
org.springframework.ws
spring ws-security
2.0.0.1版本

客户 spring-config.xml

spring-security.xml

pom.xml

org.springframework.ws
SpringWS核心
2.2.0.1发布
org.springframework.ws
spring ws-security
2.0.0.1版本
commons httpclient
commons httpclient
3.1

终端日志
INFO:==开始发送消息====
威拉普韦
****
c3hqvk9dejps923m01qrpqrh6f
200000
==发送消息结束====
信息:==接收到的消息开始====
威拉普韦
****
c3hqvk9dejps923m01qrpqrh6f
200000
==接收到的消息结束====
信息:==发送消息开始====
{“形式”:“形式动作”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='12'http://130.185.73.133/payment/verification“/\/form”,“成功”:true}
==发送消息结束====
信息:==接收到的消息开始====
{“形式”:“形式动作”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='12'http://130.185.73.133/payment/verification“/\/form”,“成功”:true}
==接收到的消息结束====

类路径中很可能存在不兼容的JAR

AbstractMethodError

AbstractMethodError
是JVM在本应存在的方法实际上不存在时抛出的运行时错误

这不应该发生在您自己的代码中:编译器阻止您调用不存在的方法

但是,当使用外部JAR(依赖于其他外部JAR)时,编译器无法警告您

假设我有一个包含类A的-1.0.jar,它有一个方法
dostufv1()

然后是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

在SpringWS中,如果您查看正在引用的SpringWS2.0.0Javadoc,您可以在这里()看到完成后签名:

完成后公共无效(MessageContext MessageContext, 对象端点, 例外情况(ex)

但是,如果您查看2.2.0 api(),相同的方法确实存在,只是具有不同的签名

完成后公共无效(MessageContext MessageContext, 例外情况(ex) 抛出WebServiceClientException

来自stacktrace的信息

堆栈跟踪指示运行时从WSTemplate类调用更高版本(请参见第一行)

java.lang.AbstractMethodError:…XwsSecurityInterceptor.afterCompletion(Lorg/springframework/ws/context/MessageContext;Ljava/lang/Exception;)V 在org…WebServiceTemplate.triggerAfterCompletion(WebServiceTemplate.java:806)

这对我来说意味着

  • 您有一个2.2.0版本的SpringWS核心(WebServiceTemplate.class)
  • 使用SpringWS-Security(XwsSecurityInterceptor),它是2.1.0版本(或介于两者之间的版本)
  • 这是不兼容的。您应该使两个版本保持同步


    编辑:通过POM,这似乎得到了证实。

    您是否考虑过检查JAR的版本(特别是SpringWS-core和SpringWS-security?)@GPI我刚刚添加了pom.xml相关依赖项。感谢您的回复。正如您所建议的,我将spring ws-core和spring ws-security都更改为2.0.0。此外,有必要将jaxb2 marshaller的上下文路径属性的名称更改为“contextPath”。再次感谢您的回复。这是一个救命的答案!非常感谢您的支持这个答案!!!!!!!
    <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>
    
    <xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config" dumpMessages="true">  
        <xwss:RequireUsernameToken passwordDigestRequired="false" nonceRequired="false"/>  
    </xwss:SecurityConfiguration>
    
    <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>
    
    <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" />
    
    <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>
    
    <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>
    
    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":"&lt;form action='https://bank.om/Payment.aspx' method='post' id='bank-form'&gt;&lt;input type='hidden' name='Amount' value='200000'/&gt;&lt;input type='hidden' name='MID' value='12'/&gt;&lt;input type='hidden' name='ResNum' value='c3hqvk9dejps923m01qrpqrh6f'/&gt;&lt;input type='hidden' name='RedirectURL' value='http://130.185.73.133/payment/verification'/&gt;&lt;\/form&gt;","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":"&lt;form action='https://bank.com/Payment.aspx' method='post' id='bank-form'&gt;&lt;input type='hidden' name='Amount' value='200000'/&gt;&lt;input type='hidden' name='MID' value='12'/&gt;&lt;input type='hidden' name='ResNum' value='c3hqvk9dejps923m01qrpqrh6f'/&gt;&lt;input type='hidden' name='RedirectURL' value='http://130.185.73.133/payment/verification'/&gt;&lt;\/form&gt;","successful":true}</ns2:message>
    </ns2:OnlinePaymentFormResponse>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    ==== Received Message End  ====