java - 使用 JAXB 编码空值

标签 java tags null jaxb marshalling

我有一个 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;

}

那些私有(private)对象也有对象,对象有对象,对象有原始类型等...(biiiiiiiig 层次结构) 例如:

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 的实例,即使当字符串为空/空、对象为空等时也是如此。应该创建所有标签。

我唯一不想做的就是在代码中的每个字段之前都放置诸如 @xmlElement(nillable=true) 之类的东西(因为我有很多字段...... )

最佳答案

这可以使用 Jboss JAXBIntroductions .我将引导您完成一个使用 Maven 构建的示例.我已将此示例的源代码作为 git repo on Github 提供。 .

项目布局

.
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- sahilm
    |   |           |-- ChildObject.java
    |   |           |-- Main.java
    |   |           `-- RootObject.java
    |   `-- resources
    |       `-- jaxb-intros.xml
    `-- test
        |-- java
        `-- resources

pom.xml

<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-介绍.xml

这是您添加元数据的地方。我们利用正则表达式的强大功能一次性注释所有字段。

<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 中。

主程序.java

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>

祝一切顺利!

关于java - 使用 JAXB 编码空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10585452/

相关文章:

java - 编码和解码 rfc2396 URL

java - HashTable 没有输出正确的数据

java - 它没有捕获我的存储过程 Spring Boot 的错误

c# - CRM 2011 自定义工作流 Linq 查询在不为空时提供空值

java - 像在 Eclipse 中一样,用于 Netbeans 的内置 Web 浏览器

ios - 如何测试 facebook 好友标记

html - 如何在 html Action 链接中包含 i 标签?

grails如何覆盖g消息标签

c - MSVS 2017 : Pointer null check not behaving as it should

Oracle Date Formatting Null 日期为 00/00/0000