[英]Marshall null values with JAXB
我有一个类型为rootObject的Java对象我想要编组。
这个对象看起来像:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD);
public class rootObject extends Object implements Serializable {
private static final long serialVersionUID = 1L;
private typeObject1 Object1;
private typeObject2 Object2;
private typeObject3 Object3;
private typeObject4 Object4;
private typeObject5 Object5;
private typeObject6 Object6;
}
那些私有对象也有对象,其对象具有包含原始类型等的对象...(例如,biiiiiiii层次结构):
public class typeObject1 implements Serializable {
private static final long serialVersionUID = 1L;
private typeObject1_1 Object1_1;
}
public class typeObject1_1 implements Serializable {
private static final long serialVersionUID = 1L;
private int foo;
private String bar;
}
我想要的是通过创建所有标记来编组rootObject的实例,即使String为空/ null,对象为null等所有标记也应该创建。
我唯一不想做的就是在每个字段之前将代码中的所有内容@xmlElement(nillable=true)
(因为我有一个字段的loooooooot ......)
这可以使用Jboss JAXBIntroductions 。 我将向您介绍使用Maven构建的示例。 我已经将这个示例的源代码作为Github上的git repo提供了。
.
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- sahilm
| | |-- ChildObject.java
| | |-- Main.java
| | `-- RootObject.java
| `-- resources
| `-- jaxb-intros.xml
`-- test
|-- java
`-- resources
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sahilm</groupId>
<artifactId>jaxb-intros-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jaxb-intros-example</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java-version>1.6</java-version>
</properties>
<dependencies>
<dependency>
<groupId>jboss.jaxbintros</groupId>
<artifactId>jboss-jaxb-intros</artifactId>
<version>1.0.2.GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>jboss-public-repository-group</id>
<name>JBoss Public Maven Repository Group</name>
<url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
请注意我是如何添加Jboss Maven存储库的,因为jaxb-intros还没有在maven central中可用。
这是您添加元数据的位置。 我们利用正则表达式的强大功能一次性注释所有字段。
<jaxb-intros xmlns="http://www.jboss.org/xsd/jaxb/intros">
<Class name="com.sahilm.*">
<XmlAccessorType value="FIELD" />
<Field name=".+">
<XmlElement nillable="true" />
</Field>
</Class>
</jaxb-intros>
com.sahilm.*
包中所有类中的所有字段都已标记为nillable
。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class RootObject {
private ChildObject obj1;
private String obj2;
private Date obj3;
// No-arg ctor needed by jaxb
public RootObject() {
}
public RootObject(final ChildObject obj1, final String obj2, final Date obj3) {
this.obj1 = obj1;
this.obj2 = obj2;
this.obj3 = obj3;
}
}
public class ChildObject {
private String childObj1;
private BigDecimal childObj2;
// No-arg ctor needed by jaxb
public ChildObject() {
}
public ChildObject(final String childObj1, final BigDecimal childObj2) {
this.childObj1 = childObj1;
this.childObj2 = childObj2;
}
}
请注意所有字段中缺少注释。 我们已经将它们映射到jaxb-intros.xml
。
final JaxbIntros config = IntroductionsConfigParser.parseConfig(Main.class.getResourceAsStream("/jaxb-intros.xml"));
final IntroductionsAnnotationReader reader = new IntroductionsAnnotationReader(config);
final Map<String, Object> jaxbConfig = new HashMap<String, Object>();
jaxbConfig.put(JAXBRIContext.ANNOTATION_READER, reader);
final JAXBContext jc = JAXBContext.newInstance(new Class[] { RootObject.class, ChildObject.class }, jaxbConfig);
final Marshaller marshaller = jc.createMarshaller();
final RootObject rootObject = new RootObject(new ChildObject("Foobar", null), null, null);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(rootObject, System.out);
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootObject>
<obj1>
<childObj1>Foobar</childObj1>
<childObj2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</obj1>
<obj2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<obj3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</rootObject>
祝一切顺利!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.