在课堂XSD选择场编组(Marshalling with XSD choice field in c

2019-10-20 04:22发布

我用一个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仍保持在选择财产?

Answer 1:

你可以做到以下几点:

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


文章来源: Marshalling with XSD choice field in class