如何访问soap标头信息?

时间:2014-09-17 23:34:18

标签: java spring web-services soap spring-ws

我使用此代码登录外部系统:

    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标题。

1 个答案:

答案 0 :(得分:1)

我假设您在对登录操作的响应中收到的UserAuth标头中的信息需要在后续的服务请求中作为SOAP标头(可能与接收的标头相同)发送。如果是这种情况,那么您应该创建自定义ClientInterceptor并在WebServiceTemplate中注册。该拦截器将从登录响应中提取标头,对其进行转换(如有必要)并将其添加到后续请求中。

请注意,此拦截器将是有状态的。因此,您需要为每个对话使用单独的WebServiceTemplate实例。