JAXB避免保存默认值

有没有办法让JAXB不保存哪些值是@Element注释中指定的默认值,然后在从XML加载null或空的元素时设置值? 一个例子:

class Example { @XmlElement(defaultValue="default1") String prop1; } Example example = new Example(); example.setProp1("default1"); jaxbMarshaller.marshal(example, aFile); 

应该生成:

  

并在加载时

 Example example = (Example) jaxbUnMarshaller.unmarshal(aFile); assertTrue(example.getProp1().equals("default1")); 

我试图这样做,以生成一个干净的XML配置文件,并使其更好的可读性和更小的尺寸。

提前退位并表示感谢。

您可以通过利用XmlAccessorType(XmlAccessType.FIELD)并将逻辑放入get / set方法来执行以下操作:

 package forum8885011; import javax.xml.bind.annotation.*; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Example { private static final String PROP1_DEFAULT = "default1"; private static final String PROP2_DEFAULT = "123"; @XmlElement(defaultValue=PROP1_DEFAULT) String prop1; @XmlElement(defaultValue=PROP2_DEFAULT) Integer prop2; public String getProp1() { if(null == prop1) { return PROP1_DEFAULT; } return prop1; } public void setProp1(String value) { if(PROP1_DEFAULT.equals(value)) { prop1 = null; } else { prop1 = value; } } public int getProp2() { if(null == prop2) { return Integer.valueOf(PROP2_DEFAULT); } return prop2; } public void setProp2(int value) { if(PROP2_DEFAULT.equals(String.valueOf(value))) { prop2 = null; } else { prop2 = value; } } } 

演示

 package forum8885011; import javax.xml.bind.*; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Example.class); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); Example example = new Example(); example.setProp1("default1"); example.setProp2(123); System.out.println(example.getProp1()); System.out.println(example.getProp2()); marshaller.marshal(example, System.out); example.setProp1("FOO"); example.setProp2(456); System.out.println(example.getProp1()); System.out.println(example.getProp2()); marshaller.marshal(example, System.out); } } 

产量

 default1 123   FOO 456   FOO 456  

了解更多信息

对于程序化解决方案,还有很好的旧Apache公共XmlSchema ,您可以使用XmlSchemaElement.getDefaultValue()检查默认值

有这样的东西

 XmlSchemaElement elem = schema.getElementByName(ELEMENT_QNAME); String defval = elem.getDefaultValue(); 

你应该能够做你需要的。 最后没有尝试过,因为我需要更直接的解决方案,但我希望有所帮助。