EclipseLink MOXyをJAXB (JSR-222)プロバイダーとして使用しており、クラスを XML にマーシャリングするためのマッピング ファイルに関するヘルプが必要です。
マッピングに外部ファイルを使用しています。
A と Bの 2 種類のトランザクションがあります。どちらにも、2 つのフィールド (text1 と text2) を持つヘッダー オブジェクト(同じオブジェクト)が含まれています。
これらを XML にマーシャリングする場合、transactionA のヘッダーのフィールドの xml タグを <headerA1> と <headerA2> にし、transactionB にリンクされているフィールドの xml タグを <headerB1> と <headerB2> にします。
どうすればそれを達成できるか(できれば継承を使用せずに)考えられますか?
コードは次のとおりです。
HEADER クラス
public class Header {
private String text1;
private String text2;
public Header(){}
public String getText1() {
return text1;
}
public void setText1(String text1) {
this.text1 = text1;
}
public String getText2() {
return text2;
}
public void setText2(String text2) {
this.text2 = text2;
}
}
取引A
public class TransactionA {
private Header statementHeader;
private BigDecimal units;
private BigDecimal price;
public TransactionA(){}
public BigDecimal getUnits() {
return units;
}
public void setUnits(BigDecimal units) {
this.units = units;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Header getStatementHeader() {
return statementHeader;
}
public void setStatementHeader(Header statementHeader) {
this.statementHeader = statementHeader;
}
}
取引B
public class TransactionB {
private Header statementHeader;
private BigDecimal units;
private BigDecimal price;
public TransactionB(){}
public BigDecimal getUnits() {
return units;
}
public void setUnits(BigDecimal units) {
this.units = units;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Header getStatementHeader() {
return statementHeader;
}
public void setStatementHeader(Header statementHeader) {
this.statementHeader = statementHeader;
}
}
マッピングファイル
<java-types>
<java-type name="Statement" xml-accessor-type="NONE">
<java-attributes>
<xml-element java-attribute="tranA" />
<xml-element java-attribute="tranB" />
</java-attributes>
</java-type>
<java-type name="Header" xml-accessor-type="NONE">
<java-attributes>
<xml-element java-attribute="text1" name="headerA1" />
<xml-element java-attribute="text2" name="headerA2" />
</java-attributes>
</java-type>
<java-type name="TransactionA" xml-accessor-type="NONE">
<java-attributes>
<xml-element java-attribute="statementHeader" name="headerA" />
<xml-element java-attribute="units" />
<xml-element java-attribute="price"/>
</java-attributes>
</java-type>
<java-type name="TransactionB" xml-accessor-type="NONE">
<java-attributes>
<xml-element java-attribute="statementHeader" name="headerB" />
<xml-element java-attribute="units" />
<xml-element java-attribute="price"/>
</java-attributes>
</java-type>
</java-types>
結果ご覧のとおり、ヘッダー B のタグはヘッダー A のタグと同じです。
<?xml version="1.0" encoding="UTF-8"?>
<tranA>
<headerA>
<headerA1>Description</headerA1>
<headerA2>Units</headerA2>
</headerA>
<units>10</units>
<price>99999999.98999999463558197021484375</price>
</tranA><tranB>
<headerB>
<headerA1>Bheader1</headerA1>
<headerA2>Bheader2</headerA2>
</headerB>
<units>10</units>
<price>99999999.98999999463558197021484375</price>
</tranB>