JAXB を使用して単一の属性を複数のフィールドに非整列化/分割する方法はありますか?
XML ファイルに time 属性を持つ要素があります (XML ファイルは変更できません)。時間属性の精度はマイクロ秒です。したがって、Java Date または Joda DateTime フィールドに属性を格納できません。
サブ秒が整数に保存され、残りがJava Dateに保存される単純なカスタムDateTimeクラスに属性を保存したい(Jodaにアクセスできない)。ただし、単一の属性を日付と整数の両方に非整列化する方法を理解できませんでした。
XML の例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<Range start="2001-01-01 01:23:45.012345"/>
</root>
シンプルなカスタム DateTime クラス:
public class DateTime {
Date date;
Integer subseconds;
public Date getDate() {
return this.date;
}
public void setDate(Date date) {
this.date = date;
}
public Integer getSubseconds() {
return this.subseconds;
}
public void setSubseconds(Integer subseconds) {
this.subseconds = subseconds;
}
}
最終的解決
@Blaise Doughan の提案に従って、DateTimeAdapter クラスを作成しました。
public class DateTimeAdapter extends XmlAdapter<String, DateTime> {
@Override
public String marshal (DateTime v) {
return v.toString();
}
@Override
public DateTime unmarshal (String v) {
return new DateTime(v);
}
}
更新されたカスタムDateTime
クラス (コンストラクターを追加し、不変にしました):
public class DateTime {
Date date = new Date();
Integer subseconds = 0;
public DateTime(String dateString) {
if (dateString.matches("^\\d{4}-{\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d+") {
try {
this.date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateString.substring(0, 19));
}
catch (ParseException ex) {
ex.printStackTrace();
}
this.subseconds = Integer.valueOf(dateString.substring(20));
}
}
public Date getDate() {
return this.date;
}
public Integer getSubseconds() {
return this.subseconds;
}
...additional methods...
}
非整列化以外の他の領域で使用できるように、代わりにカスタムDateTime
クラス コンストラクターで文字列変換を行うことにしました。XmlAdapter
DateTime
アダプターへの参照は次のとおりです。
@XmlAttribute(name = "start")
@XmlJavaTypeAdapter(DateTimeAdapter.class)
private DateTime range;