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