Java : unable to marshal type "entities.Person" as an element because

标签 java xml jaxb marshalling

在我的网络服务(使用 RestEasy)项目中,我依赖于一个 jar。我从那个 jar 中使用了一个 java 类:Person。

我的问题是我需要将一个 Person 实例序列化为 XML,但我收到以下错误:

unable to marshal type "entities.Person" as an element because it is missing an @XmlRootElement annotation

但是,我无法更改 Person 类以添加注释 @XmlRootElement(它是第三方 jar)。

是否有任何其他方法(方法、库...)可以在不注释 Person 类的情况下将 Person 实例编码为 XML?

顺便说一句,这是我使用的代码,但由于缺少注释而失败了:

String result;
Person person = personManager.findByPersonId(personId);
StringWriter sw = new StringWriter();
JAXBContext personContext = JAXBContext.newInstance(Person.class);
Marshaller personMarshaller = personContext.createMarshaller();
personMarshaller.marshal(person, sw);
result = sw.toString();
return Response.status(200).entity(result).build();

非常感谢。

最佳答案

JAXB (JSR-222)实现不需要将任何注释添加到您的域模型中。在没有 @XmlRootElement(或 @XmlElementDecl)的情况下,您只需将根对象包装在 JAXBElement 的实例中。

JAXBElement<Person> jaxbElement = new JAXBElement<Person>(new QName("person"), Person.class, person);
personMarshaller.marshal(jaxbElement, sw);

了解更多信息


注意:我是 EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导和成员专家组。

如果您需要为您的模型提供元数据,但无权访问源,那么 MOXy 提供了一个外部元数据文档扩展,您可以将其用于此目的。

Thank you, the link you gave me is useful, but I wonder if this EclipseLink library is safe to integrate in a commercial product (license)...

自版本 12.1.1 以来,MOXy 一直是 WebLogic 中的默认 JAXB 实现,因此它绝对是企业级的。

EclipseLink(和 MOXy)根据 Eclipse 公共(public)许可证和 Eclipse 分发许可证 (BSD) 获得双重许可:

关于Java : unable to marshal type "entities.Person" as an element because,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21384550/

相关文章:

java - 使用 Eclipse 从 JAXB 生成示例 XML

java - 从 shell 读取 jar 的 MANIFEST.MF

ruby - Mechanize /Nokogiri 无法使用 xpath 解析 XML

C#:使用 XmlTextWriter 清理 XML 文本值?

jaxb - 将外部 JAXB 绑定(bind)文件应用于从 WSDL 导入的模式元素

java - 推土机 - 测绘集合

java - Android Studio Newb - 自动完成或只是安装不正确?

java - 单个图像按钮用作开始-停止-开始

java - && 和 || 的区别

python - 如何使用 Python 对大 XML 文件执行查询?