JAXB Marshaller 不存在值为 null 的元素
在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将Java对象与XML文档进行相互转换的技术。它可以将Java对象转换为XML文档,也可以将XML文档转换为Java对象。在使用JAXB进行对象与XML的转换时,我们经常会遇到一个问题,即如何处理对象中的null值。JAXB Marshaller是用于将Java对象转换为XML文档的核心组件,它负责将Java对象的属性映射为XML元素。默认情况下,JAXB Marshaller会忽略值为null的属性,即不会在生成的XML文档中包含这些属性对应的元素。例如,我们有一个Java对象Person,包含了姓名、年龄和地址三个属性:javapublic class Person { private String name; private Integer age; private String address; // 省略构造方法和getter、setter方法}如果我们将一个值为null的Person对象使用JAXB Marshaller转换为XML文档,生成的XML文档中将不会包含age属性对应的元素。
javaPerson person = new Person();person.setName("Alice");person.setAge(null);person.setAddress("123 Main Street");JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);Marshaller marshaller = jaxbContext.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);StringWriter writer = new StringWriter();marshaller.marshal(person, writer);String xml = writer.toString();System.out.println(xml);运行以上代码,输出的XML文档如下:
xml可以看到,age属性对应的元素并没有出现在生成的XML文档中。解决方案:通过设置JAXB Marshaller的属性来包含值为null的元素当我们希望在生成的XML文档中包含值为null的属性对应的元素时,可以通过设置JAXB Marshaller的属性来实现。Alice 123 Main Street
javamarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);设置JAXB Marshaller的setProperty方法的参数为对应的属性名称和值。其中,JAXB_FRAGMENT属性用于指定是否生成XML文档的根元素,JAXB_FORMATTED_OUTPUT属性用于指定是否格式化生成的XML文档,JAXB_FORMATTED_OUTPUT属性用于指定是否生成JSON格式的文档。下面是修改后的代码:
javaPerson person = new Person();person.setName("Alice");person.setAge(null);person.setAddress("123 Main Street");JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);Marshaller marshaller = jaxbContext.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);StringWriter writer = new StringWriter();marshaller.marshal(person, writer);String xml = writer.toString();System.out.println(xml);运行修改后的代码,输出的XML文档如下:
xml可以看到,age属性对应的元素出现在生成的XML文档中,但是它的值为空。通过设置JAXB Marshaller的属性,我们可以控制生成的XML文档是否包含值为null的属性对应的元素。默认情况下,JAXB Marshaller会忽略值为null的属性,不会在生成的XML文档中包含这些属性对应的元素。如果我们希望在生成的XML文档中包含值为null的元素,可以通过设置JAXB Marshaller的属性来实现。Alice 123 Main Street