我正在运行一个简单的Web服务,我在构建和验证响应时遇到了问题。此问题与名称空间有关。
在我的WSDL中,我有:
<wsdl:definitions targetNamespace="http://me.com/mystuff">
<wsdl:types><xs:schema targetNamespace="http://me.com/mystuf">
....
<xs:complexType name="MyResponse">
<xs:all>
<xs:element name="Value" type="xs:boolean"/>
<xs:element name="ResponseString" type="xs:string"/>
</xs:all>
</wsdl:types>
//MyResponse is bound as a response for a soap operation
</wsdl:definitions>
我首先尝试将响应构建为:
String NAMESPACE_URI="http://me.com/mystuff";
Namespace namespace = Namespace.getNamespace("xyz", NAMESPACE_URI);
Element response = new Element(txType + "Response", namespace);
Element value = new Element("Value");
value.setText("true");
response.addContent(value);
Element responseString = new Element("ResponseString");
response.addContent(responseString);
responseString.setText("");
但我得到了:
org.xml.sax.SAXException: Exception in startElement: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
org.jdom.JDOMException:startElement中的异常:NAMESPACE_ERR:尝试以对名称空间不正确的方式创建或更改对象。
所以我在响应中的子元素中添加了名称空间声明:
Element value = new Element("Value", namespace);
Element responseString = new Element("ResponseString", namespace);
但后来我得到了:
ERROR PayloadValidatingInterceptor:238 - XML validation error on response: cvc-complex-type.2.4.a: Invalid content was found starting with element 'xyz:Value'. One of '{Value, ResponseString}' is expected.
有关如何解决此问题的任何想法?
答案 0 :(得分:2)
如果您控制架构,请将elementFormDefault="qualified"
添加到架构中的xs:schema元素;这应该使您现在生成的Value和ResponseString的名称空间限定版本有效。
如果您不控制架构,那么Value和ResponseString元素将需要 not 才能进行命名空间限定,这看起来就像您原来的尝试所做的那样;我无法看到那里出了什么问题。如果你能弄清楚哪个语句特别引起了这个错误,那会有所帮助。