WebServiceTransportException:Spring-WS中未经授权的[401]
时间:2020-03-06 14:32:46 来源:igfitidea点击:
我们正在努力配置我们的Web应用程序,使其能够通过Spring WS与Web服务连接。我们尝试使用客户端Spring-WS文档中的示例,但最终出现了WebServiceTransportException。 XML配置如下所示:
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory"/>
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
<property name="credentials">
<bean class="org.apache.commons.httpclient.UsernamePasswordCredentials">
<constructor-arg value="john"/>
<constructor-arg value="secret"/>
</bean>
</property>
</bean>
</property>
</bean>
我们已经能够通过编程方式配置应用程序,但是无法将此配置"转移"到Spring XML配置中,因为某些设置程序未使用Spring期望的格式。 (HttpState.setCredentials(...)具有两个参数)。该配置是从公司中其他一些Spring-WS客户端代码中删除的。
这是有效的配置:
public List<String> getAll() {
List<String> carTypes = new ArrayList<String>();
try {
Source source = new ResourceSource(request);
JDOMResult result = new JDOMResult();
SaajSoapMessageFactory soapMessageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance());
WebServiceTemplate template = new WebServiceTemplate(soapMessageFactory);
HttpClientParams clientParams = new HttpClientParams();
clientParams.setSoTimeout(60000);
clientParams.setConnectionManagerTimeout(60000);
clientParams.setAuthenticationPreemptive(true);
HttpClient client = new HttpClient(clientParams);
client.getState().setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("username", "password"));
CommonsHttpMessageSender messageSender = new CommonsHttpMessageSender(client);
template.setMessageSender(messageSender);
template.sendSourceAndReceiveToResult(SERVICE_URI,
source, result);
// Handle the XML
} catch (IOException e) {
throw new RuntimeException(e);
} catch (SOAPException e) {
throw new RuntimeException(e);
}
return carTypes;
}
有人知道如何解决我的问题吗?我在那里看到的每个教程都列出了第一个配置。看来,当我在messageSender对象上设置凭据时,它们只会被忽略...
解决方案
我们如何区分这些:
<constructor-arg value="john"/> <constructor-arg value="secret"/>
尝试将其替换为:
<property name="userName" value="john" /> <property name="password" value="secret" />
希望能帮助到你。
使用构造函数覆盖HttpClient,该构造函数接受参数并使用构造函数args遍历Spring
public MyHttpClient(HttpClientParams params, UsernamePasswordCredentials usernamePasswordCredentials) {
super(params);
getState().setCredentials(AuthScope.ANY, usernamePasswordCredentials);
}

