如何在没有拦截器的情况下将标头添加到soap fault中

时间:2013-12-27 09:56:51

标签: java web-services soap jax-ws cxf

我正在尝试找到一种方法,使用拦截器将标头添加到soap fault中。有没有替代解决方案。

基本上我的肥皂请求如下。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://kp.web.com/schema/" xmlns:sch1="http://kp.web.com/Shared/schema/">
   <soapenv:Header>
      <sch:clientHeader>
         <sch1:consumerId>12</sch1:consumerId>
      </sch:clientHeader>
   </soapenv:Header>
   <soapenv:Body>
      <sch:addRequest>
         <sch:field1>-3</sch:field1>
         <sch:field2>-1</sch:field2>
      </sch:addRequest>
   </soapenv:Body>
</soapenv:Envelope>

成功消息。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
   <soap:Header>
      <serverHeader xmlns:ns2="http://kp.web.com/schema/" xmlns="http://kp.web.com/Shared/schema/">
         <ns2:consumerId>12</ns2:consumerId>
         <ns2:completionCode>100</ns2:completionCode>
      </serverHeader>
   </soap:Header>
   <soap:Body>
      <addResponse xmlns="http://kp.web.com/schema/" xmlns:ns2="http://kp.web.com/Shared/schema/">
         <result>-4</result>
      </addResponse>
   </soap:Body>
</soap:Envelope>

发生故障时

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Faulted you sent -1 and -1</faultstring>
         <detail>
            <faultResponse xmlns:ns2="http://kp.web.com/schema/" xmlns="http://kp.web.com/Shared/schema/">400</faultResponse>
         </detail>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

我希望故障响应是这样的。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://kp.web.com/schema/" xmlns:sch1="http://kp.web.com/Shared/schema/">
    <soap:Header>
          <serverHeader>
             <ns2:consumerId>12</ns2:consumerId>
             <ns2:completionCode>100</ns2:completionCode>
          </serverHeader>
   </soap:Header>
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Faulted you sent -1 and -1</faultstring>
         <detail>
             <faultResponse xmlns:ns2="http://kp.web.com/schema/" xmlns="http://kp.web.com/Shared/schema/">400</faultResponse>
         </detail>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

我可以使用持有人还是有任何解决方案。我不能使用拦截器,因为我需要发回消费者ID。在拦截器中,我没有请求细节。

2 个答案:

答案 0 :(得分:1)

您可以使用SOAP Message Handlers and Handler Chains。另一种方法是使用Filters。 我使用Handler Chains来修改SOAP标头。

link可能会有所帮助。

答案 1 :(得分:1)

你仍然可以使用拦截器。有两种方法可以从拦截器获取所需的数据:

1)在业务逻辑中,如果在(@Resource)中注入了WebServiceContext,则可以设置以后应该能够从消息中获取的属性。 (或者来自message.getExchange()。getInMessage())

2)从邮件中,您可以获取Exchange,然后获取inMessage。从该消息中,您可以获取解组的内容(inMessage.getContent(List.class))并传递到您的类中。

希望有所帮助。