我使用Java类动态生成WSDL架构。我把它作为我的一个领域:
@XmlElements({
@XmlElement(name = "A", type = String.class),
@XmlElement(name = "B", type = Integer.class),
@XmlElement(name = "C", type = String.class),
@XmlElement(name = "D", type = String.class)
})
protected Object aOrBOrCOrD;
在编组期间,当设置单选属性aOrBOrCOrD时,将在XML中设置哪个标记名称(A,B,C或D)?
因为只有一个字段包含数据。而String也可能意味着3个选择元素中的任何一个。怎么解决这个问题?
我可以在4中拆分单个字段,并在以某种方式生成WSDL时仍保持choice属性吗?
答案 0 :(得分:0)
您可以执行以下操作:
<强>富强>
您可以使用@XmlElements
和Object
类型的属性,而不是@XmlElementRefs
和JAXBElement
类型的属性。 JAXBElement
允许您保留元素名称。
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
@XmlElementRefs({
@XmlElementRef(name = "A", type = JAXBElement.class),
@XmlElementRef(name = "B", type = JAXBElement.class),
@XmlElementRef(name = "C", type = JAXBElement.class),
@XmlElementRef(name = "D", type = JAXBElement.class)
})
protected JAXBElement<?> aOrBOrCOrD;
}
<强>的ObjectFactory 强>
与@XmlElementRef
一起,您需要在使用@XmlElementDec
注释的类上添加相应的@XmlRegistry
注释。
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
@XmlElementDecl(name="A")
public JAXBElement<String> createA(String value) {
return new JAXBElement<String>(new QName("A"), String.class, value);
}
@XmlElementDecl(name="B")
public JAXBElement<Integer> createB(Integer value) {
return new JAXBElement<Integer>(new QName("B"), Integer.class, value);
}
@XmlElementDecl(name="C")
public JAXBElement<String> createC(String value) {
return new JAXBElement<String>(new QName("C"), String.class, value);
}
@XmlElementDecl(name="D")
public JAXBElement<String> createD(String value) {
return new JAXBElement<String>(new QName("D"), String.class, value);
}
}
<强>演示强>
import java.io.StringReader;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class, ObjectFactory.class);
StringReader xml = new StringReader("<foo><C>Hello World</C></foo>");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Foo foo = (Foo) unmarshaller.unmarshal(xml);
JAXBElement<?> aOrBOrCOrD = foo.aOrBOrCOrD;
System.out.println(aOrBOrCOrD.getName().getLocalPart());
System.out.println(aOrBOrCOrD.getDeclaredType());
System.out.println(aOrBOrCOrD.getValue());
}
}
<强>输出强>
C
class java.lang.String
Hello World