Spring 向SOAP消息添加头元素

Spring 向SOAP消息添加头元素,spring,soap,cxf,Spring,Soap,Cxf,我正试图找到一种向SOAP消息添加头元素的方法。 如果我使用@WebParam,并将标题设置为true,那么它工作正常,该参数在中很好。但是,需要向我的API添加一系列参数,这几乎不是一个选项 乍一看,拦截器似乎不可能实现,所以我正在研究SOAPHandler,但很难找到关于这一点的明确信息 这是我的spring配置: <bean id="testWebservice" class="org.springframework.remoting.jaxws.JaxWsPortProxyFact

我正试图找到一种向SOAP消息添加头元素的方法。 如果我使用
@WebParam
,并将
标题设置为
true
,那么它工作正常,该参数在
中很好。但是,需要向我的API添加一系列参数,这几乎不是一个选项

乍一看,拦截器似乎不可能实现,所以我正在研究SOAPHandler,但很难找到关于这一点的明确信息

这是我的spring配置:

<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类TestHandler实现SOAPHandler{
@凌驾
公共无效关闭(MessageContext上下文){
}
@凌驾
公共集getHeaders(){
返回null;
}
@凌驾
公共布尔handleFault(SOAPMessageContext上下文){
返回true;
}
@凌驾
公共布尔handleMessage(SOAPMessageContext上下文){
if(Boolean.TRUE.equals(context.get(MessageContext.MESSAGE\u OUTBOUND\u属性))){
试一试{
列表标题=新建ArrayList();
收割台Dummy收割台;
dummyHeader=newheader(newqname(“dummy”),“decapitated”,newjaxbdatabinding(String.class));
headers.add(dummyHeader);
context.put(Header.Header\u列表,headers);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
返回true;
}
}

问题是我有点不知所措。使用handler是正确的方法吗?如果是,你能给我举个好例子吗?有没有办法用拦截器做到这一点?或者我完全是这里的目标…

让它像这样工作:

     @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);
        }
@覆盖
公共布尔handleMessage(SOAPMessageContext上下文){
试一试{
SOAPMessage msg=context.getMessage();
SOAPPart=msg.getSOAPPart();
SOAPEnvelope=part.getEnvelope();
SOAPHeader=envelope.getHeader();
if(Boolean.TRUE.equals(context.get(MessageContext.MESSAGE\u OUTBOUND\u属性))){
if(头==null){
header=envelope.addHeader();
}
this.addToHeader(信封,标题,“MessageID”,UUID.randomUUID().toString());
...
}否则{
if(标题!=null){
迭代器i=header.getChildElements();
while(i.hasNext()){
SOAPElement el=(SOAPElement)i.next();
字符串标记名=el.getLocalName();
字符串值=el.getValue();
...
}
}
}
}捕获(例外e){
...
}
返回true;
}
私有void addToHeader(SOAPEnvelope信封、SOAPHeader头、字符串键、字符串值)引发SOAPException{
名称qname=envelope.createName(键“ns1”,”http://ecom.bnpp.com");
SOAPHeaderElement元素=header.addHeaderElement(qname);
元素addTextNode(值);
}

说得好,我忘了提到它不起作用。代码在没有异常的情况下执行,但不会将虚拟头添加到消息中。
     @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);
        }