Spring WS正在生成空的SOAP Envelop

时间:2018-03-16 13:15:17

标签: spring jaxb spring-ws jaxb2

我想用Spring WS WebServiceTemplate调用SOAP服务。我经常使用它,它总是工作到目前为止。但是现在我得到一个空身肥皂盒:

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body/></SOAP-ENV:Envelope>

我使用JAXB Maven插件创建了请求和响应类。生成的源代码看起来与正在运行的服务完全相同。

示例:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "startRequest_RequestParameters",
    propOrder = {"url"}
)
@XmlRootElement(
 name = "startRequest"
)
public class StartRequest {
  @XmlElement(
    required = true
  )
  @XmlSchemaType(
    name = "anyURI"
  )
  protected String url;

  public StartRequest() {
  }

  public String getUrl() {
    return this.url;
  }

  public void setUrl(String value) {
    this.url= value;
  }
}

我使用marshallSendAndReceive

调用webservice模板
StartRequest request = new StartRequest();
request.setUrl(url);
StartResponse response = (StartResponse) webServiceTemplate.marshalSendAndReceive(endpointUrl, request);

我使用java配置配置WebServiceTemplate:

public WebServiceTemplate startRequestWebServiceTemplate() throws Exception {
    return createWebServiceTemplate(createMarshaller(), createSecurityInterceptor(username, password), createMessageSender(proxyHost, proxyPort));
}


private WebServiceTemplate createWebServiceTemplate(Jaxb2Marshaller marshaller, ClientInterceptor securityInterceptor, WebServiceMessageSender messageSender) {
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    webServiceTemplate.setMarshaller(marshaller);
    webServiceTemplate.setUnmarshaller(marshaller);
    webServiceTemplate.setMessageSender(messageSender);
    if (securityInterceptor != null) {
        webServiceTemplate.setInterceptors((ClientInterceptor[]) Arrays.asList(securityInterceptor, createLoggingInterceptor()).toArray());
    } else {
        webServiceTemplate.setInterceptors((ClientInterceptor[]) Arrays.asList(createLoggingInterceptor()).toArray());
    }
    webServiceTemplate.setCheckConnectionForFault(true);
    webServiceTemplate.afterPropertiesSet();
    return webServiceTemplate;
}

private Jaxb2Marshaller createMarshaller() throws Exception {
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    jaxb2Marshaller.setClassesToBeBound(StartRequest.class, StartResponse.class);
    jaxb2Marshaller.afterPropertiesSet();
    return jaxb2Marshaller;
}

private ClientInterceptor createLoggingInterceptor() {
    return new SoapLoggingInterceptor(systemName);
}

private Wss4jSecurityInterceptor createSecurityInterceptor(String username, String password) {
    Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
    wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
    wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
    wss4jSecurityInterceptor.setSecurementUsername(username);
    wss4jSecurityInterceptor.setSecurementPassword(password);
    wss4jSecurityInterceptor.setSkipValidationIfNoHeaderPresent(true);
    wss4jSecurityInterceptor.setValidateRequest(false);
    wss4jSecurityInterceptor.setValidateResponse(false);
    return wss4jSecurityInterceptor;
}

private HttpComponentsMessageSender createMessageSender(String proxyHost, String proxyPort) {
    HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender(createHttpClient(proxyHost, proxyPort));
    httpComponentsMessageSender.setAcceptGzipEncoding(true);
    return httpComponentsMessageSender;
}

private HttpClient createHttpClient(String proxyHost, String proxyPort) {
    RequestConfig.Builder configBuilder = RequestConfig.custom()
            .setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT_MILLISECONDS)
            .setSocketTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS)
            .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT);
    addProxySettings(configBuilder, proxyHost, proxyPort);

    HttpClientBuilder clientBuilder = HttpClients.custom().setDefaultRequestConfig(configBuilder.build());
    addInterceptor(clientBuilder);
    addConnectionManager(clientBuilder);
    return clientBuilder.build();
}

private void addProxySettings(RequestConfig.Builder configBuilder, String proxyHost, String proxyPort) {
    if (StringUtils.isNotBlank(proxyHost)) {
        configBuilder.setProxy(new HttpHost(proxyHost, Integer.valueOf(proxyPort)));
    }
}

private void addInterceptor(HttpClientBuilder clientBuilder) {
    clientBuilder.addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor());
}

private void addConnectionManager(HttpClientBuilder clientBuilder) {
    if (maxConnections > DEFAULT_MAX_CONNECTIONS_PER_ROUTE) {
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(maxConnections);
        cm.setDefaultMaxPerRoute(maxConnections);
        clientBuilder.setConnectionManager(cm);
    }
}

此配置适用于其他soap实现。但在这里,我只是拿着肥皂信封,空体。

有谁知道这里有什么问题?

1 个答案:

答案 0 :(得分:0)

在重构LoggingInterceptor时,我做错了什么。处理请求时,它从MessageContext中获取了响应部分,而不是请求部分,这导致用响应覆盖请求。因此,如果您遇到此类问题,请检查拦截器是否能够正确响应并请求