次の抽象クラスを検討してください -
public abstract class Car
{
public abstract void drive(double miles);
}
上記のクラスを拡張するサンプル クラス (説明用) を次に示します。
public class Ferrari extends Car
{
private String lastUsed; // Ferrari specific field not in Car
private boolean f1Car; // Ferrari specific field not in Car
@XmlElement
public void setF1Car(boolean f1Car)
{
this.f1Car = f1Car;
}
public boolean isF1Car() { return f1Car; }
@XmlElement
public void setLastUsed(String lastUsed)
{
this.lastUsed = lastUsed;
}
public String getLastUsed() { return lastUsed; }
public void drive(double miles)
{
// implementation
}
}
Car オブジェクトを含むレポート クラスがあります -
@XmlRootElement
public class CarTestReport
{
private String date;
private double miles;
private Car car;
@XmlElement
public void setDate(String date) { this.date = date;}
public String getDate() {return date;}
@XmlElement
public void setMiles(double miles) { this.miles = miles; }
public double getMiles() {return miles;}
@XmlElement
public void setCar(Car car) { this.car = car; }
public Car getCar() { return car; }
}
そして、ここに JAXB を使用して CarTestReport オブジェクトをマーシャリングするコードがあります -
public static void main(String[] args) throws Exception
{
Ferrari ferrari = new Ferrari();
ferrari.setLastUsed("July 5 2012");
ferrari.setF1Car(false);
CarTestReport report = new CarTestReport();
report.setDate("July 6 2012");
report.setMiles(200);
report.setCar(ferrari);
File file = new File("carTestReport.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(CarTestReport.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(report, file);
}
問題は、抽象型 Car が原因で、JAXB がそれを無視し、CarTestReport オブジェクトをマーシャリングするときに Ferrari オブジェクトをマーシャリングしないことです。私が得る出力はこれです -
<carTestReport>
<car/>
<date>July 6 2012</date>
<miles>200.0</miles>
</carTestReport>
ご覧のとおり、Ferrari オブジェクトが設定されていても、'car' ノードの下には何も入力されていません。この問題を解決するには?