JAXB:在带有@XmlAttribute </string>的List <string>类型的解组字段中出现问题

时间:2014-02-05 07:22:37

标签: java jaxb marshalling unmarshalling

我正在使用JAXB进行编组和解组对象。我有一个Class MyBean字符串列表作为字段,并注明@XmlAttribute

@XmlRootElement
public class MyBean {
    public MyBean() {
        super();

    }
    private List<String> actualValue;

    @XmlAttribute
    public List<String> getActualValue() {
        if (actualValue == null) {
            actualValue = new ArrayList<String>();
        }
        return actualValue;
    }
    public void setActualValue(List<String> values) {
        this.actualValue = values;
    }
}

以下是用于封送和取消封送MyBean的Test类。

public class Test {

public static void main(String[] args) {

    try {
        // create object ....
        MyBean myBean = new MyBean();
        List<String> values = new ArrayList<String>();
        values.add("Sanjv Singh Baghel");
        myBean.setActualValue(values);



        // Marsheling
        File file = new File("D://Temp//hello2.xml");
        JAXBContext jaxbContext2 = JAXBContext.newInstance(MyBean.class);
        Marshaller jaxbMarshaller2 = jaxbContext2.createMarshaller();
        jaxbMarshaller2.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        jaxbMarshaller2.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        jaxbMarshaller2.marshal(myBean, file);

        // Un-Marsheling
        JAXBContext jaxbContext = JAXBContext.newInstance(MyBean.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

        // printing actual value
        MyBean myBean2 = (MyBean) jaxbUnmarshaller.unmarshal(file);
        List<String> actualValue = myBean2.getActualValue();
        System.out.println(actualValue);
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }

}

输出:

Before actualValue : ["sanjv singh baghel"]
After  actualValue : ["sanjv, singh, baghel"]

奇怪的是,我在这里面对的是原始actualValue只有一个带空格的字符串,在取消编组后,该单个字符串将转换为字符串列表(除以空格)。

我想知道为什么会发生这种情况/它有什么问题。

因为,我找到了两种可能的解决方案:

  • @XmlAttribute替换为@XmlElement
  • List<String> actualValue;&amp;字符串需要映射到模式简单类型

1 个答案:

答案 0 :(得分:4)

XML Schema具有数据类型列表的概念。

<xs:attribute name="actualValue">
     <xs:simpleValue>
         <xs:list itemType="xs:string"/>
     <xs:simpleValue>
</xs:attribute>

这在XML中表示为空格分隔值。

<foo actualValue="one two three"/>

这是您通过将@XmlAttribute注释放在List<String>类型的属性上而要求JAXB执行的操作。请参阅@XmlAttribute的javadoc中的“示例3”。

如果您将@XmlAttribute替换为@XmlElement,您将获得以下代表:

<foo>
    <actualValue>one</actualValue>
    <actualValue>two</actualValue>
    <actualValue>three</actualValue>
</foo>