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() {}
    ....
}

BaseCompanyLookup:

@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 マーシャラーに生成させるにはどうすればよいでしょうか?

編集:解決策が見つかりました。これは、JAXB のデフォルトを EclipseLink MOXy 実装に切り替えた WebLogic 12c に移行したときに発生しました。その実装には、ここで説明したケースのバグがあるようです。指示に従ってGlassfish JAXB RIに切り替えると、この問題が修正されました。これらの手順は次のとおりです。http://docs.oracle.com/cd/E24329_01/web.1211/e24964/data_types.htm#CIHBHDGI

4

1 に答える 1