java - 在没有默认 POJO 构造函数的情况下将 POJO 转换为 XML

标签 java xml javabeans default-constructor

我正在尝试使用 java.beans.XMLEncoder 将 POJO(普通旧 Java 对象)转换为 XML。我的代码运行良好,但我发现了一个有趣的问题,当我在我的 POJO 中省略默认构造函数时会出现这个问题。类(class)如下。

没有默认构造函数的 POJO

public class NFLTeam implements Serializable {

  private String name;
  private String description;

  // public NFLTeam() {
  //
  // }

  public NFLTeam(String name, String description) {
    this.name = name;
    this.description = description;
  }

  public String getName() {
        return name;
    }

  public void setName(String name) {
    this.name = name;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

}

调用 XMLEncoder

public static void main(String args[]) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    XMLEncoder xmlEncoder = new XMLEncoder(byteArrayOutputStream);
    NFLTeam team = new NFLTeam("Bears", "Play for Chicago");
    xmlEncoder.writeObject(team);
    xmlEncoder.close();
    System.out.println(byteArrayOutputStream);
}

省略默认构造函数的控制台输出

java.lang.InstantiationException: oce.wsd.pojos.NFLTeam
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(NFLTeam);
Continuing ...
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_45" class="java.beans.XMLDecoder">
</java>

带有默认构造函数的控制台输出

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_45" class="java.beans.XMLDecoder">
<object class="oce.wsd.pojos.NFLTeam">
    <void property="description">
      <string>Play for Chicago</string>
    </void>
    <void property="name">
     <string>Bears</string>
   </void>
</object>
</java>

我在谷歌上搜索,但找不到任何解释。为什么隐式默认构造函数对 XMLEncoder 来说不够用?

最佳答案

不幸的是,JAXB(和相关技术)需要一个非参数构造函数(隐式默认构造函数也可以)。

根据规范,在 native Oracle JAX 库的情况下,编码(marshal)处理和取消编码(marshal)处理都需要它。

根据人类逻辑,编码/序列化不需要它。例如最流行的 JSON 库 Jackson 确实有这样的需求,只是为了反序列化。

有第三方 XML JAX 兼容的解析器,它们的限制也较少......但这个问题通常不是与第三方库斗争的原因。

JAX 允许非公开的非参数构造函数。我通常按​​如下方式创建它:

/** For JAXB only. Do not call directly and do not delete! */
@Deprecated
protected NFLTeam () {
    // nothing
}

关于java - 在没有默认 POJO 构造函数的情况下将 POJO 转换为 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25082649/

相关文章:

java - 使用 Enum 的单例与使用双重检查锁定的单例

Java 1.5 : mathematical formula parser

java - 显示为两位小数

xml - 如何获取 XML 文档中的当前位置

java - JTree:如何添加节点的属性作为自己的叶子?

Java MYSQL 带复选框选择

interface - @Transient注解和transient修饰符有什么区别

java - 有没有一种通过枚举实现多个比较器的好方法?

xml - 基于 XML 文件创建 Oracle 表

java - 为 XMLRootElement 命名