0

我遇到的问题是 Apache CXF 将命名空间放在元素内而不是肥皂信封内。

我使用 codegen maven 插件从 WSDL 生成客户端代码。

以下是 WSDL 中的名称空间:

              xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
              xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
              xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
              xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
              xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

当我发出 SOAP 请求时,我可以在日志中看到已发送以下消息:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <ns1:userRegistrationRequest xmlns:ns1="http://some.com/namespace1">
        <InputParameter xmlns:ns2="http://some.com/namespace1">
            <ns2:Message>
                <ns2:Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                <ns2:HashTable>
                    <ns2:Item key="action">
                        <ns2:Value>some_action</ns2:Value>
                    </ns2:Item>
                </ns2:HashTable>
            </ns2:Message>
        </InputParameter>
    </ns1:userRegistrationRequest>
</soap:Body>

问题是当我构造消息时,我的代码中的 Value 元素为空,但在这里它出现在 XSI 命名空间中。

我期望得到的是这样的(值元素不应该存在,XSI 应该在信封元素中):

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
    <ns1:userRegistrationRequest xmlns:ns1="http://some.com/namespace1">
        <InputParameter xmlns:ns2="http://some.com/namespace1">
            <ns2:Message>
                <ns2:HashTable>
                    <ns2:Item key="action">
                        <ns2:Value>some_action</ns2:Value>
                    </ns2:Item>
                </ns2:HashTable>
            </ns2:Message>
        </InputParameter>
    </ns1:userRegistrationRequest>
</soap:Body>

有谁知道如何防止 CXF 生成那个空的 Value 元素并将命名空间放在肥皂信封元素中?

4

1 回答 1

0

好的,所以来回答我的问题。这个问题有两个方面。

首先,将命名空间添加到信封元素。可以通过编写自定义拦截器并在早期阶段注册它来完成。像这样的东西:

import java.util.Map;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;

public class MyInterceptor extends AbstractSoapInterceptor {

    private Map<String, String> nsMap;

    public MyInterceptor(Map<String, String> nsMap) {
        super(Phase.USER_LOGICAL);
        this.nsMap = nsMap;
      }

    public void handleMessage(SoapMessage message) throws Fault {
        message.put("soap.env.ns.map", nsMap); 
        message.put("disable.outputstream.optimization", Boolean.TRUE); 
    }

}

我在这里找到了上述解决方案

其次,要删除空值元素,应将 xsd 更改为该元素具有 minOccurs="0" 和 nillable = "false"。

于 2015-06-17T14:14:35.280 回答