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();
你应该能够做你需要的。 最后没有尝试过,因为我需要更直接的解决方案,但我希望有所帮助。
- 数学表达式(字符串)到Java中的数字
- 处理遗留数据库时,Hibernate会对丢失的行进行扼流
- Spring Batch,JdbcExecutionContextDao java.util.Map $ Entry deserializer issue,xstream 1.4.1
- JComboBox在多个表格单元格之间共享,自动选择当前选定的项目
- 为不同环境定义Spring bean时的常用策略
- 设置Spring Security:从元素’security:http’开始发现无效内容
- `copy(List dest,List src)`和`copy(List dest,List src)之间的区别
- 无法调试java.lang.NoClassDefFoundError:com / google / inject / internal / util / $ Preconditions
- 以编程方式覆盖log4j配置:FileAppender的文件位置