我遇到的问题是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元素中?
答案 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”。