1

我们有一个复杂的类结构,我们试图使用 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() {}
    ....
}

BaseCompany 查找:

@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 {
}

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 时,它已将其 JAXB 默认值切换为 EclipseLink MOXy 实现。对于我在此处描述的情况,该实现似乎有一个错误。按照切换到 Glassfish JAXB RI 的说明为我们解决了这个问题。以下是这些说明:http ://docs.oracle.com/cd/E24329_01/web.1211/e24964/data_types.htm#CIHBHDGI

4

1 回答 1

1

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

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

@XmlSeeAlso(TypeOfCompany.class)
public class SpecificCompanyLookup extends BaseCompanyLookup<TypeOfCompany> {
    public SpecificCompanyLookup() {}
}
于 2013-06-05T20:02:19.970 回答