SpringWS正在生成空的SOAP信封

SpringWS正在生成空的SOAP信封,spring,jaxb,spring-ws,jaxb2,Spring,Jaxb,Spring Ws,Jaxb2,我想用SpringWS-WebServiceTemplate调用SOAP服务。我经常使用它,到目前为止一直有效。但现在我只得到一个空主体的soap信封: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body/></SOAP-ENV:Envelope> 我使用MarshallSen

我想用SpringWS-WebServiceTemplate调用SOAP服务。我经常使用它,到目前为止一直有效。但现在我只得到一个空主体的soap信封:

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body/></SOAP-ENV:Envelope>
我使用MarshallSendReceive调用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实现工作良好。但这里我只是得到了一个肥皂信封,里面有空的身体


有人知道这里出了什么问题吗?

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

这是我自己的错。我在重构LoggingInterceptor时出错了。在处理请求时,它从MessageContext中获取响应部分,而不是请求部分,这导致用响应覆盖请求。我应该删除这个问题吗?请将其作为完整答案发布,以帮助未来的读者。
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);
    }
}