使用Java添加Soap Action Header

时间:2015-04-15 14:58:48

标签: java soap wsdl cxf jax-ws

如何在java中添加soap动作头。我在Header中使用<a:Action s:mustUnderstand="1">MyServiceName</a:Action>在SoapUI中测试了该服务,它可以按照此帖SOAP Action mismatch error while testing a WCF service with SoapUI正常工作。如果没有此标头,我会收到The SOAP action specified on the message, '', does not match the HTTP SOAP Action,错误,这与我从Java客户端应用程序获得的错误相同。

PS:我使用Apache CXF从wsdl生成存根。我还尝试使用wsimport生成Java客户端存根来使用JAX-WS RI。使用这两种情况的错误相同。

有什么想法?我找不到一个正确的结论性帖子,用Java解决这个问题。

以下是我尝试的内容,但我想不推荐使用com.sun ... package中的类,这可能导致跨不同jdk的可移植性问题。JAX-WS - Adding SOAP Headers

1 个答案:

答案 0 :(得分:4)

我遇到了类似的问题,这对我有用。我使用wsimport生成了sei。

如果标题是wsdl的一部分,您可以使用-XadditionalHeaders生成接受标题的SEI。

如果不是,则必须使用SOAPHandler以编程方式添加标头。虽然很简单!

这是一个详细说明的链接。 http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client/

更改方法 handleMessage ,如下所示

public boolean handleMessage(SOAPMessageContext smc) {

    Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (outboundProperty.booleanValue()) {

        SOAPMessage message = smc.getMessage();

        try {
            SOAPFactory soapFactory = SOAPFactory.newInstance();
            SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
            SOAPHeader header = envelope.addHeader();
            SOAPHeaderElement se=header.addHeaderElement(new QName("http://schemas.microsoft.com/ws/2005/05/addressing/none", "Action"));
            //se.setMustUnderstand(true); //Ideal way to set if webservice supports
            se.addTextNode("some text");
            se.addAttribute(soapFactory.createName("S:mustUnderstand"),"1"); //S: or s: depending on xmlns

        } catch (Exception e) {
            e.printStackTrace();
        }

    } else {
        try {
            SOAPMessage message = smc.getMessage();
            message.writeTo(System.out);
            System.out.println("");

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    return true;
}

//附加处理程序的代码。

Service1 service1 = new Service1();
        IService1 iService1 = service1.getBasicHttpBindingIService1();

        BindingProvider bindingProvider = (BindingProvider) iService1;
        final Binding binding = bindingProvider.getBinding();
        List<Handler> handlerList = binding.getHandlerChain();

        if (handlerList == null) {
            handlerList = new ArrayList<Handler>();
        }

        handlerList.add(new HeaderHandler());
        binding.setHandlerChain(handlerList);
        ServiceResponse serviceResponse = iService1.callServiceMethod1(serviceRequest);