JAXB 编组超类

Posted

技术标签:

【中文标题】JAXB 编组超类【英文标题】:JAXB marshalling superclass 【发布时间】:2010-03-10 18:21:30 【问题描述】:

我正在编写一个 Resteasy 服务器应用程序,但无法让我的超类编组。我有这样的代码:

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "person")
class Person 
  protected String name;

  @XmlElement(name = "name")
  public String getName()  return name; 

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


@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "employee")
class Employee extends Person 
  protected Integer id;

  @XmlElement(name = "id")
  public Integer getId()  return id; 

  public void setId(Integer id)  this.id = id; 

当我将 Employee 类编组为 XML 时,我得到如下内容:

<employee>
  <id>12345</id>
</employee>

没有从 Person 类继承的名称字段的输出。

我做错了什么?

谢谢,拉尔夫

【问题讨论】:

感谢 Ralph,这足以让我深入研究 jaxb。 :) 这个问题似乎是题外话,因为它对 OP 由于自己的错误而面临的特定问题过于具体。这是他自己承认的。 (搜索“到期”) 【参考方案1】:

我不确定您是如何配置 JAXB 上下文或编组器的,但如下:-

public static void main(String[] args) throws Exception


        Employee employee = new Employee();
        employee.setId(1);
        employee.setName("Ralph");

        JAXBContext context = JAXBContext.newInstance(Employee.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(employee, System.out);


给出:-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <name>Ralph</name>
    <id>1</id>
</employee>

【讨论】:

其实我不是。我正在运行类似于: return Response.ok(new GenericEntity>(listOfEmployees).build(); 从我的 JAX-RS URL 处理程序的代码,因为我需要能够在 REST 中返回其他内容标头响应,这是我能找到返回员工 ArrayList 的唯一方法。我从未明确创建过 JAXBContext 或 Marshaller。有更好的方法吗?也许我会尝试将 marshaller 的输出提供给 Response.ok () 方法。 对不起,我不熟悉 JAX-RS。 男孩,这是一个 DUE(愚蠢的用户错误)。我创建了一个注释来填充数据库列中的字段(“ORM”的私有实现),但没有遍历超类字段,所以它们都是空的。现在可以使用了。 拉尔夫,你能在这里解释一下你的评论吗?我遇到了类似的问题,并非所有项目都正确地从我的域类中编组,或者我得到的 XML 标记中的一些没有值。你做了什么来解决这个问题?

以上是关于JAXB 编组超类的主要内容,如果未能解决你的问题,请参考以下文章

自定义 jaxb 编组输出

编组时出现 JAXB 错误

为啥 JAXB 需要一个无参数构造函数来编组?

解组 JAXB 编组列表失败并出现 NullPointerException

JAXB:如何编组列表中的对象?

JAXB Java 编组错误