我正在使用Apache CXF 2.7.3,并遇到一个我真的不明白的命名空间问题.我已经尝试过广泛搜索,但我找到的大部分结果都是针对不同的行为.问题是在调用Web服务时,如果参数元素是名称空间限定的,它将失败.消息中的所有其他元素都是合格的,它接受它,而不是参数元素.这是精确的行为:
请求WITHOUT参数元素限定:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ord="http://www.example.org/order">
<soapenv:Header/>
<soapenv:Body>
<ord:getOrder>
<id>a</id>
</ord:getOrder>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
结果成功:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getOrderResponse xmlns:ns2="http://www.example.org/order">
<return>
<ns2:errorCode/>
<ns2:errorMessage/>
<ns2:order>
<ns2:orderNumber>ABC123</ns2:orderNumber>
<ns2:lastName>Smith</ns2:lastName>
</ns2:order>
</return>
</ns2:getOrderResponse>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
请求WITH参数限定:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ord="http://www.example.org/order">
<soapenv:Header/>
<soapenv:Body>
<ord:getOrder>
<ord:id>a</ord:id>
</ord:getOrder>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
导致JAXB异常:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: unexpected element (uri:"http://www.example.org/order", local:"id"). Expected elements are <{}id></faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
在我所做的所有研究中,这通常意味着命名空间在某处不匹配.但是我已经彻底检查了它,并且命名空间在任何地方都是相同的,包括ObjectFactory.class,package-info.class和cxf-servlet.xml配置文件以及@WebService注释.任何人都可以指出我正确的方向,我在这里失踪了什么?
我有传入的JSON字符串,我需要解组到JAXB注释对象.我正在使用jettison这样做.JSON字符串如下所示:
{
objectA :
{
"propertyOne" : "some val",
"propertyTwo" : "some other val",
objectB :
{
"propertyA" : "some val",
"propertyB" : "true"
}
}
}
Run Code Online (Sandbox Code Playgroud)
ObjectA代码如下所示:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectA")
public class ObjectA {
@XmlElement(required = true)
protected String propertyOne;
@XmlElement(required = true)
protected String propertyTwo;
@XmlElement(required = true)
protected ObjectB objectB;
}
Run Code Online (Sandbox Code Playgroud)
ObjectB类代码如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectB")
public class ObjectB {
@XmlElement(required = true)
protected String propertyA;
@XmlElement(required = true)
protected boolean propertyB;
}
Run Code Online (Sandbox Code Playgroud)
用于解组的代码:
JAXBContext …Run Code Online (Sandbox Code Playgroud)