【问题标题】:Why am I getting javax.xml.bind.UnmarshalException when calling a soap web service为什么我在调用肥皂网络服务时收到 javax.xml.bind.UnmarshalException
【发布时间】:2019-05-08 19:45:05
【问题描述】:

我正在尝试使用 SOAP Web 服务,并且我已经使用 Spring-ws 编写了我的 SOAP 客户端。这还包括消息签名。但是,当我尝试触发请求时,我得到了异常。从服务器的角度来看,服务器正在发送成功的响应,但我无法解组它。

我遵循了很多建议,包括来自此的一个 UnmarshallingFailureException, unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault")

按照上面的链接,但是删除了异常,但反过来我得到一个空响应对象,我无法追踪到响应丢失的位置。

这是我的 Config 类方法:

    public WebServiceTemplate accountsInquiryWebServiceTemplate() throws Exception {
        WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
        Jaxb2Marshaller accountsInquiryMarshaller = accountsInquiryMarshaller();
        webServiceTemplate.setMarshaller(accountsInquiryMarshaller);
        webServiceTemplate.setUnmarshaller(accountsInquiryMarshaller);
        ClientInterceptor[] clientInterceptors = new ClientInterceptor[1];
        clientInterceptors[0] = wsClientSecurityInterceptor();
        webServiceTemplate.setInterceptors(clientInterceptors);
        webServiceTemplate.setCheckConnectionForFault(true);
        webServiceTemplate.setDefaultUri(serviceURL);

        return webServiceTemplate;
    }
private Jaxb2Marshaller accountsInquiryMarshaller() {
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setContextPaths(new String[]{
             "com.accounting.integrationservice"
});
        return jaxb2Marshaller;
    }
private Wss4jSecurityInterceptor wsClientSecurityInterceptor() throws Exception {
        Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
        wss4jSecurityInterceptor.setSecurementActions("Signature");
        wss4jSecurityInterceptor.setSecurementUsername(username);
        wss4jSecurityInterceptor.setSecurementPassword(password);
        wss4jSecurityInterceptor.setSecurementSignatureCrypto(clientCrypto());
        wss4jSecurityInterceptor.setValidationActions("Signature");

        return wss4jSecurityInterceptor;
    }
private Crypto clientCrypto() throws Exception {
        CryptoFactoryBean cryptoFactoryBean = new CryptoFactoryBean();
        cryptoFactoryBean.setKeyStoreLocation(resourceLoader.getResource("classpath:accountsInquiry/keystore/" + keyStoreLocation));
        cryptoFactoryBean.setKeyStorePassword(keyStorePassword);
        cryptoFactoryBean.afterPropertiesSet();
        return cryptoFactoryBean.getObject();
    }

客户端调用如下:

Response response = accountsWebServiceTemplate.marshalSendAndReceive(request);

我得到的异常堆栈如下:它类似于上面提到的链接,所以不放整个异常堆栈

org.springframework.ws.soap.security.AbstractWsSecurityInterceptor.handleResponse(AbstractWsSecurityInterceptor.java:247)
 - Could not validate request: No WS-Security header found
org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault"). Expected elements are http://www.qualityaccounts.com/IntegrationService/schemas/ProductInfo/v1}
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:911)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:784)
    at org.springframework.ws.support.MarshallingUtils.unmarshal(MarshallingUtils.java:62)
    at org.springframework.ws.client.core.WebServiceTemplate$3.extractData(WebServiceTemplate.java:413)
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:619)
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383)

【问题讨论】:

    标签: soap-client spring-ws


    【解决方案1】:

    好的,我试图使用“签名”来验证响应的安全标头,即使没有标头。但问题是,如果我没有指定 ValidationAction,它会抛出 NullPointerException,所以它至少需要一个 ValidationAction。

    为了解决这一切,我告诉 Spring 安全性不要验证这段代码的响应。

    wss4jSecurityInterceptor.setValidateResponse(false);

    感谢这篇文章 Spring Security - Wss4jSecurityInterceptor - Nullpointer

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2017-01-16
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多