私は JAXB を使用して、Java オブジェクト (xml エクスポート) から xml ファイルを生成しています。また、その逆 (xml インポート) も使用しています。
場合によっては、整数クラス属性を初期化するために「マジックナンバー」を使用しています.0も有効であり、属性を初期化して「未編集」としてマークしたいからです。
JAXB から生成された xml 出力で、このマジック ナンバーが存在しなければ幸いです。JAXBにマッピング情報のようなものを提供することは可能ですか?
例をご覧ください。
例:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="my-root")
public class ExampleClass {
/** integer value which represents empty */
public static final int EMPTY_INT = Integer.MAX_VALUE;
/** my id */
@XmlElement(name="id")
private int mMyId = EMPTY_INT;
public void setMyId(int myId) {
mMyId = myId;
}
public int getMyId() {
return mMyId;
}
}
JAXB は次のようなものを生成します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<my-root>
<id>2147483647</id>
</my-root>
私が欲しいのは:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<my-root>
<id></id>
</my-root>
属性値が EMPTY_INT で、その逆 (インポート) の場合は、JAXB に「何も生成しない」ように指示する必要があります (例を参照)。
それはどういうわけか可能ですか?または、その目標を達成するための他の方法はありますか?
ご協力ありがとうございました。シュテファン
アップデート:
回答に基づいて、次のことを試しました。
注: コードは短縮されています (例: インポートなし)
1) クラスを追加します: Mydapter
public class MyAdapter extends XmlAdapter<String, Integer> {
@Override
public Integer unmarshal(String val) throws Exception {
System.out.println("Debug1");
return Integer.parseInt(val);
}
@Override
public String marshal(Integer val) throws Exception {
System.out.println("Debug2");
if (val == Integer.MAX_VALUE) {
return "";
} else {
return val.toString();
}
}
}
2) "int" の代わりに "Integer" を使用するように ExampleClass を適合させ、注釈を付けます。
@XmlJavaTypeAdapter(MyAdapter.class)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="my-root")
public class ExampleClass {
/** integer value which represents empty */
public static final int EMPTY_INT = Integer.MAX_VALUE;
/** my id */
@XmlElement(name="id")
private Integer mMyId = EMPTY_INT;
public void setMyId(int myId) {
mMyId = myId;
}
public int getMyId() {
return mMyId;
}
}
3) xml エクスポートを実行するコード
public class XMLImportExport {
public static void exportToXml(File xmlFile) throws Exception {
JAXBContext jc = JAXBContext.newInstance(ExampleClass.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(new ExampleClass(), xmlFile);
}
}
4) xml 出力はまだ
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<my-root>
<id>2147483647</id>
</my-root>
ありがとう、ステフェン