【问题标题】:Add header elements to SOAP message将标头元素添加到 SOAP 消息
【发布时间】:2012-12-18 12:31:25
【问题描述】:

我正在尝试找到一种将标头元素添加到 SOAP 消息的方法。 如果我使用@WebParam 并将header 设置为true,那么它工作正常,该参数很好地在<soap:header> 中。但是,这需要向我的 API 添加一堆参数,这几乎不是一种选择。

起初看起来拦截器似乎是不可能的,所以我正在查看 SOAPHandlers,但很难找到关于此的明确信息。

这是我的弹簧配置:

<bean id="testWebservice" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean" >
    <property name="serviceInterface" value="com...TestWebService"/>
    <property name="wsdlDocumentUrl" value="http://localhost:9062/test-ws/remoting/test?wsdl"/>
    <property name="serviceName" value="TestWebService"/>
    <property name="namespaceUri" value="http://test.com"/>
    <property name="portName" value="TestServicePort"/>
    <property name="lookupServiceOnStartup" value="false"/>
    <property name="handlerResolver" ref="myResolver"/>
</bean>

<bean id="myResolver" class="com...TestHandlerResolver" />

我的处理程序(链接在 TestHandlerResolver 中):

public class TestHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public void close(MessageContext context) {
    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        if (Boolean.TRUE.equals(context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) {

            try {
                List<Header> headers = new ArrayList<Header>();
                Header dummyHeader;
                dummyHeader = new Header(new QName("dummy"), "decapitated", new JAXBDataBinding(String.class));
                headers.add(dummyHeader);
                context.put(Header.HEADER_LIST, headers);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return true;
    }
}

问题是我有点不知所措。使用处理程序是正确的方法吗?如果可以,你能给我一个很好的例子吗?有没有办法用拦截器做到这一点?还是我完全是这里的目标……

【问题讨论】:

  • 好点,我忘了说它不起作用。代码无异常执行,但虚拟头没有添加到消息中。

标签: spring soap cxf


【解决方案1】:

让它像这样工作:

     @Override
     public boolean handleMessage(SOAPMessageContext context) {

            try {
                SOAPMessage msg = context.getMessage();
                SOAPPart part = msg.getSOAPPart();
                SOAPEnvelope envelope = part.getEnvelope();

                SOAPHeader header = envelope.getHeader();

                if (Boolean.TRUE.equals(context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) {
                    if (header == null) {
                        header = envelope.addHeader();
                    }
                    this.addToHeader(envelope, header, "MessageID", UUID.randomUUID().toString());
    ...
                } else {
                    if (header != null) {
                        Iterator<?> i = header.getChildElements();
                        while (i.hasNext()) {
                            SOAPElement el = (SOAPElement) i.next();
                            String tagName = el.getLocalName();
                            String value = el.getValue();
    ...
                        }
                    }

                }
            } catch (Exception e) {
...

            }
            return true;
        }

        private void addToHeader(SOAPEnvelope envelope, SOAPHeader header, String key, String value) throws SOAPException {
            Name qname = envelope.createName(key, "ns1", "http://ecom.bnpp.com");
            SOAPHeaderElement element = header.addHeaderElement(qname);
            element.addTextNode(value);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多