Apache CXF客户端命名空间是元素而不是信封

时间:2015-06-17 12:44:36

标签: web-services soap wsdl cxf cxf-codegen-plugin

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

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

以下是WSDL中的命名空间:

QList<QObject*> child = ui->widget->layout()->children();

foreach (QObject *var, child)
{
    delete var;
}

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

              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"

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

我期望得到的是这样的(Value元素不应该出现,XSI应该在envelope元素中):

<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>

有没有人知道如何防止CXF生成那个空的Value元素并将命名空间放在soap envelope元素中?

1 个答案:

答案 0 :(得分:0)

好的,那么回答我的问题。这个问题有两个方面。

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

import pyqtgraph as pg

data = pg.np.random.normal(size=100)

app = pg.QtGui.QApplication([])
win = pg.GraphicsWindow()
p1 = win.addPlot(y=data)

win.nextRow()
p2 = win.addPlot(y=data)
p2.setXLink(p1)

win.nextRow()
p3 = win.addPlot(y=data)
p3.setXLink(p1)


def linkLogXChecks(plotitems):
    def broadcast(state):
        for p in plotitems:
            p.ctrl.logXCheck.setChecked(state)
    for p in plotitems:
        p.ctrl.logXCheck.toggled.connect(broadcast)

linkLogXChecks([p1, p2, p3])


pg.QtGui.QApplication.instance().exec_()

我找到了上述解决方案here

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