1

私は 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>

ありがとう、ステフェン

4

1 に答える 1

1

@XmlJavaTypeAdapter(YourAdapter.class) で mMyId にアノテーションを付けてから、アダプターを作成してジョブを実行します。このようなもの(未テスト):

public class YourAdapter extends XmlAdapter<String, Integer> {
    public Integer unmarshal(String val) throws Exception {
        return Integer.parseInt(val);
    }
    public String marshal(Integer val) throws Exception {
        if ( val == Integer.MAX_VALUE) {
            return "";
        } else {
            return val.toString();
        }
    }        
}
于 2012-11-05T15:36:34.180 に答える