我使用此代码登录外部系统:
LoginResponse response = (LoginResponse) webServiceTemplate.marshalSendAndReceive(myRequest, new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
((SoapMessage)message).setSoapAction("http://www.system.com//Authentication/Login");
}
});
我收到一种LoginResponse但它没有任何价值。
LoginResponse类型只包含:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "LoginResponse", namespace = "http://www.system.com/Authentication/")
public class LoginResponse {
}
我需要从标头访问UserAuth值,但这不包含在LoginResponse对象中。
SOAP响应是:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<UserAuth xmlns="http://www.system.com/ws/">
<Value>234234k234jl2k</Value>
</UserAuth>
</soap:Header>
<soap:Body>
<LoginResponse xmlns="http://www.system.com/Authentication"/>
</soap:Body>
</soap:Envelope>
如何访问标头信息,在本例中为UserAuth值?
我是否需要使用较低级别的内容并从soap响应中解析所需的值?
更新:
我想我需要使用SAAJ的自定义SOAP请求(类似于SOAP request to WebService with java)并处理响应。
我的理解是,尽管响应中的soap标头是可选的,但大多数客户端在使用SOAP时都使用标头来发送身份验证类型信息?也许wsdl或生成.class文件的机制不正确,因此响应不会填写所有必填字段,在本例中为soap标题。
答案 0 :(得分:1)
我假设您在对登录操作的响应中收到的UserAuth
标头中的信息需要在后续的服务请求中作为SOAP标头(可能与接收的标头相同)发送。如果是这种情况,那么您应该创建自定义ClientInterceptor
并在WebServiceTemplate
中注册。该拦截器将从登录响应中提取标头,对其进行转换(如有必要)并将其添加到后续请求中。
请注意,此拦截器将是有状态的。因此,您需要为每个对话使用单独的WebServiceTemplate
实例。