jax-ws webservice:无法向messageContext添加标头

时间:2013-09-05 17:56:20

标签: soap header jax-ws


public class MessageHandler implements SOAPHandler<SOAPMessageContext> {
    public boolean handleMessage(SOAPMessageContext messageContext) {
       SOAPMessage msg = messageContext.getMessage();

       Boolean outbound = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
       if(outbound) { 
           System.out.println("SOAP message departing…"); 
           System.out.println("************** "+messageContext.get(MessageContext.HTTP_RESPONSE_CODE));


           MimeHeaders mh = msg.getMimeHeaders();
           mh.setHeader("customer-header", "customer-header");

           Iterator itr3 = mh.getAllHeaders();
           while(itr3.hasNext()) {
               MimeHeader obj = (MimeHeader) itr3.next();
               System.out.println("hhhhhhhhhhhhhhhhh "+obj.getName());
               System.out.println("hhhhhhhhhhhhhhhhh "+obj.getValue());
}

以下是我的Soap消息处理程序的handleMessage方法的代码片段,其中我正在尝试将自定义标头添加到我的soap响应中。虽然我能够将它添加到MimeHeader对象但是当我调用Web服务时,响应不包含它。

我注意到的另一件事是MimeHeader中的标题与我在soap响应中得到的标题不匹配。它们甚至不与请求标头匹配。 我正在使用soap UI来调用我的soap服务并查看标题。

请你帮我理解我在这里做错了什么。

1 个答案:

答案 0 :(得分:1)

目前还不是很清楚你要做什么,但你提到了请求和响应标题,所以这可能就是你所追求的:

@SuppressWarnings("unchecked")
Map<String, List<String>> headers = (Map<String, List<String>>)messageContext.get(MessageContext.HTTP_RESPONSE_HEADERS);
List<String> value = new ArrayList<String>();
value.add("customer-header");
headers.put("customer-header", value);

MimeHeaders用于在使用SOAP附件时出现在邮件的MIME部分中的标头,我认为在此之后您还需要调用saveChanges()。对于常用标题,您需要使用MessageContext.HTTP_RESPONSE_HEADERS

根据您的评论

编辑

  

我试过这个,但是因为我得到一个空的'headers'对象,当我尝试添加一个自定义标题时,它会抛出空指针异常。

即使您的实现返回null,仍应该可以向响应中添加自定义标头。你有没有试过这样的东西:

@SuppressWarnings("unchecked")
Map<String, List<String>> headers = (Map<String, List<String>>)messageContext.get(MessageContext.HTTP_RESPONSE_HEADERS);

List<String> value = new ArrayList<String>();
value.add("customer-header");

if (headers != null) {
    headers.put("customer-header", value);
} else {
    Map<String, List<String>> brandNewHeaders = new HashMap<String, List<String>>();
    brandNewHeaders.put("customer-header", value);
    messageContext.put(MessageContext.HTTP_RESPONSE_HEADERS, brandNewHeaders);
}