它定义了一个类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版本?
答案 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提供商在实现中改变了一些东西?