我用一个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被设置,其标签名称(A,B,C或d)将被在XML设置?
由于只有一个字段,它会包含的数据。 和字符串也可能意味着任何1 3个选择元素。 如何解决这个问题?
我可以在4分割单场,当以某种方式生成的WSDL仍保持在选择财产?
你可以做到以下几点:
Java模型
富
取而代之的@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