我有以下 Java 类:
public class input{
@XmlElement(namespace="http://www.example.com/TopLevel")
public TopLevel TopLevel;
}
和
public class TopLevel{
private String attribute;
public void setAttribute(String attribute) {
this.attribute = attribute;
}
public String getAttribute() {
return attribute;
}
}
和
import javax.xml.bind.annotation.XmlType;
@XmlType(namespace="http://org.classes.SubClass", name="SubClass")
public class SubClass extends TopLevel {
private String attribute2;
public String getAttribute2() {
return attribute2;
}
public void setAttribute2(String attribute2) {
this.attribute2 = attribute2;
}
}
部署类后,我想要发出 SOAP 请求并能够将 XML 中的 TopLevel 转换为 SubClass。我的请求如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
... xmlns:top1="http://www.example.com/TopLevel"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header/>
<soapenv:Body>
<top:TopSubClass_TestRequest>
<par:input>
<input>
<top1:toplevel xsi:type="ns5:subclass" xmlns:ns5="http://org.classes.SubClass">
<attribute2>test</attribute2>
</top1:toplevel>
</input>
</par:input>
</top:TopSubClass_TestRequest>
</soapenv:Body>
</soapenv:Envelope>
我期望的是 SubClass 将映射到 TopLevel,我将能够使用 attribute2
但由于某种原因,这不会被验证。不要介意请求中似乎没有定义的 namespace 。我跳过了它们以使请求更容易阅读。验证问题发生在以下行:
<top1:toplevel xsi:type="ns5:subclass" xmlns:ns5="http://org.classes.SubClass">
说:
Invalid xsi:type qname: 'subclass' in element Input
谁能指出我做错了什么?根据所有示例,我发现这应该是处理它的方法。
最佳答案
我已经找到了解决问题的方法。 我正在使用 IBM ODM,尽管我的所有类都定义了命名空间,但 ODM 不会将命名空间导入到 WSDL 中,除非在输入对象中定义了对象。
因此我需要添加:
@XmlType(namespace = "Some namespace")
public class Input() {
public TopLevel topLevel;
public SubClass subClass;
}
并使用@XmlType
注释来注释TopLevel和SubClass。
关于java - 为什么我的 XML 架构无法验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47508890/