JAXB行为封送具有多个具有相同名称的setter的类

时间:2016-06-15 07:26:21

标签: java jaxb marshalling

它定义了一个类DataTO:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class DataTO {
    private boolean data;

    public Boolean getData() {
        return data;
    }

    public void setData(boolean data) {
        this.data = data;
    }

    public void setData(Boolean data) {
        this.data = data;
    }

}

使用Java 6编组工作正常,生成的XML是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dataTO>
    <data>true</data>
</dataTO>

使用Java 7,我们遇到了一个无法正确生成XML的问题。我们只能在某些特定的复杂环境中重现该问题,不能被隔离:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dataTO/>

为什么不同的行为取决于Java版本?

2 个答案:

答案 0 :(得分:0)

我如何成功地隔离行为正在改变一点DataTO类:

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;

public class TestMain {

    @XmlRootElement
    public static class DataTO {
        private boolean data;

        public Boolean getData() {
            return data;
        }

        public void setData(boolean data) {
            this.data = data;
        }

    }

    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(DataTO.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        DataTO d = new DataTO();
        d.setData(true);

        StringWriter sw = new StringWriter();

        jaxbMarshaller.marshal(d, sw);
        System.out.println(sw);

        DataTO dd = (DataTO) jaxbUnmarshaller.unmarshal(new StringReader(sw.toString()));
        System.out.println(dd.getData());

    }

}

答案 1 :(得分:0)

所以,这是我的理论。

在没有定义任何访问类型的情况下,您的JAXB提供程序默认访问类型需要具有与该字段匹配类型的getter / setter。

支持这一点的是,添加具有布尔返回类型的getter可以解决示例中的问题。

如果你使用@XmlAccessorType(XmlAccessType.FIELD),那么无论它是什么getter / setter都可以,因为它会忽略它们。

对于java版本之间的不同行为,我无法解释它。也许您的JAXB提供商在实现中改变了一些东西?