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); }