java - JAXB-RI 编码通用列表给出了不正确的输出

标签 java xml generics jaxb marshalling

我们有一个复杂的类结构,我们正在尝试使用 JAXB-RI 将其编码到 xml 文件。编码似乎可以在 Spring 的 jaxb2Marshaller 中正常工作,但在我们尝试使用的 jaxb-ri 中却不能。 (我们使用 Java 6 和 jaxb-2.1.13)

这是我们当前使用 JAXB-RI 编码后看到的输出示例:

<?xml version="1.0" encoding="UTF-8"?>
     <specificCompanyList>
       <org>com.ourcompany.etc.etc.TypeOfCompany@56cb0eed</org>
       <org>com.ourcompany.etc.etc.TypeOfCompany@3125a57</org>
       ....
     </specificCompanyList>

这就是我们希望看到的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<specificCompanyList>
  <org id="123456" name=" COMPANY NAME 1"/>
  <org id="098765" name=" COMPANY NAME 2"/>
  ....
</specificCompanyList>

这是有关我们的类结构的一些信息。如果这令人困惑,我深表歉意——我想把所有的事情都摆在桌面上。类名和路径也已更改和缩短。

成为根元素的类:

@XmlRootElement(name="specificCompanyList")
public class SpecificCompanyLookup extends BaseCompanyLookup<TypeOfCompany> {
    public SpecificCompanyLookup() {}
    ....
}

基本公司查找:

@XmlAccessorType(XmlAccessType.FIELD)
abstract class BaseCompanyLookup<T extends OrgNode> implements Lookup {
    @XmlElement(name="org")
    final Set<T> companyList = new TreeSet<T>(.....);
}

组织节点:

@XmlAccessorType(XmlAccessType.FIELD)
classOrgNode extends BaseLookupItem {
}

基本查找项:

@XmlAccessorType(XmlAccessType.FIELD)
public class BaseLookupItem {

    @XmlAttribute(required = true)
    protected String id;

    @XmlAttribute(required = true)
    protected String name;

    ....
}

扩展 OrgNode 的类:

class TypeOfCompany extends OrgNode {
    ....
}

所以: BaseLookupItem -> OrgNode -> TypeOfCompany

有谁知道是什么导致了这种糟糕的输出?我们如何使 JAXB-RI 编码器生成我们需要的输出?

编辑:我们找到了解决方案。当我们迁移到 WebLogic 12c 时,就发生了这种情况,WebLogic 12c 已将其 JAXB 默认值切换为 EclipseLink MOXy 实现。对于我在这里描述的情况,该实现似乎存在错误。按照切换到 Glassfish JAXB RI 的说明为我们解决了这个问题。以下是这些说明:http://docs.oracle.com/cd/E24329_01/web.1211/e24964/data_types.htm#CIHBHDGI

最佳答案

我确认这实际上是 MOXy 中的一个错误,并已打开以下错误来跟踪该问题 https://bugs.eclipse.org/bugs/show_bug.cgi?id=410001

我还确认,像这样添加 @XmlSeeAlso 注释将是这种情况的解决方法。

@XmlSeeAlso(TypeOfCompany.class)
public class SpecificCompanyLookup extends BaseCompanyLookup<TypeOfCompany> {
    public SpecificCompanyLookup() {}
}

关于java - JAXB-RI 编码通用列表给出了不正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16865375/

相关文章:

java - java中Json输出添加父节点

java - 如何对 html 字符串进行 xsl 模板匹配

java - 如何使用泛型调用最具体的方法?

c# - 带有泛型参数的普通 C# 类无缘无故无法编译

java - 如何将不均匀的二维数组连接成一维数组(java)

java - "A List is an ordered Collection..."是什么意思?

xml - 使用 XML::Simple 从散列数组构建 XML,其中一些键作为属性

java - 集合或可变参数中的通用枚举

Java - 将图像转换为 Word 文档

android - 当内部 View 与父级右对齐时,RelativeLayout 背景会拉伸(stretch)