问题描述
有没有办法让 JAXB 不保存哪些值是 @Element 注释中指定的默认值的字段,然后在从 XML 加载 null 或空元素时将值设置为它?一个例子:
Is there any way to make JAXB not save fields which values are the default values specified in the @Element annotations, and then make set the value to it when loading elements from XML that are null or empties? An example:
class Example { @XmlElement(defaultValue="default1") String prop1; } Example example = new Example(); example.setProp1("default1"); jaxbMarshaller.marshal(example, aFile);
应该生成:
<example/>
加载时
Example example = (Example) jaxbUnMarshaller.unmarshal(aFile); assertTrue(example.getProp1().equals("default1"));
我正在尝试这样做是为了生成一个干净的 XML 配置文件,并使其更具可读性和更小的尺寸.
I am trying to do this in order to generate a clean XML configuration file, and make it better readable and smaller size.
提前致谢.
推荐答案
您可以通过利用 XmlAccessorType(XmlAccessType.FIELD) 并将逻辑放入 get/set 方法中来执行以下操作:
You could do something like the following by leveraging XmlAccessorType(XmlAccessType.FIELD) and putting logic in the get/set methods:
示例
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 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <example/> FOO 456 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <example> <prop1>FOO</prop1> <prop2>456</prop2> </example>
更多信息
- http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html