【发布时间】:2016-09-28 10:01:17
【问题描述】:
我在调用我的 web 服务时遇到问题,Spring WS 只返回一个 WebServiceTransportException: Internal Server Error 而不是预期的 SoapFaultException。当我在 SOAPUI 中触发调用时,我得到了肥皂错误。
WebServiceTransportException 还会抑制响应的输出,因此我在日志中看不到问题所在。
我在带有配置类的 Spring Boot 应用程序中使用 Spring WS。
public class SoapClientConfig {
private static Logger log = LoggerFactory.getLogger(SoapClientConfig.class);
private static final int DEFAULT_CONNECTION_TIMEOUT_MILLISECONDS = 60000;
private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS = 60000;
private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 2;
public static final int CONNECTION_REQUEST_TIMEOUT = 30000;
@Value("${soap.client.proxy.host}")
protected String proxyHost;
@Value("${soap.client.proxy.port}")
protected String proxyPort;
@Value("${soap.client.max.connections}")
private int maxConnections;
public Jaxb2Marshaller createMarshaller(String packageName) throws Exception {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setContextPath(packageName);
jaxb2Marshaller.afterPropertiesSet();
return jaxb2Marshaller;
}
public 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(false);
webServiceTemplate.afterPropertiesSet();
return webServiceTemplate;
}
private ClientInterceptor createLoggingInterceptor() {
return new SoapLoggingInterceptor();
}
public Wss4jSecurityInterceptor createSecurityInterceptor(String username, String password) throws Exception {
Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
wss4jSecurityInterceptor.setSecurementUsername(username);
wss4jSecurityInterceptor.setSecurementPassword(password);
wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
wss4jSecurityInterceptor.afterPropertiesSet();
return wss4jSecurityInterceptor;
}
public HttpComponentsMessageSender createMessageSender() {
return new HttpComponentsMessageSender(createHttpClient());
}
private HttpClient createHttpClient() {
RequestConfig.Builder configBuilder = RequestConfig.custom()
.setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT_MILLISECONDS)
.setSocketTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS)
.setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT);
addProxySettings(configBuilder);
HttpClientBuilder clientBuilder = HttpClients.custom().setDefaultRequestConfig(configBuilder.build());
addInterceptor(clientBuilder);
addConnectionManager(clientBuilder);
return clientBuilder.build();
}
private void addProxySettings(RequestConfig.Builder configBuilder) {
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);
}
}
当请求正确时,一切正常。但是当请求包含错误时,我没有得到肥皂错误的原因。只有 WebServiceTransportException。
Caused by: org.springframework.ws.client.WebServiceTransportException: Internal Server Error [500]
at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:609)
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:378)
【问题讨论】:
-
WebServiceTransportExceptin 在连接服务器出现问题时抛出。那么,您在这里期望的错误是什么?你怎么知道这个异常吞下了soap fault异常?我认为 spring 做出了区分并抛出了 IO 异常,而不是把所有东西都包装成一个肥皂错误。
-
当我用正确的参数调用服务时,它会返回一个有效的响应。但是当我发送带有错误参数的请求时,会导致soapfault(例如,在soapui中执行相同的请求时),我只会得到WebServiceTransportException。这不可能是连接问题,因为我得到了具有正确参数的有效结果。 (参数是指网络服务的输入)
-
您能否添加一个示例示例,该示例在哪些地方可以工作,哪些地方不能工作?我只是想看看是什么触发了内部服务器错误。您还可以检查返回的响应 xml 以查看它是否在 spring 中有错误有效负载,否则 spring 会将其包装为传输错误。
-
webServiceTemplate.setCheckConnectionForFault(false);尝试将其设置为 true。看看它是否改变了什么。
标签: spring web-services soap spring-ws