是否可以为JAXB提供有关元素值的映射信息?

时间:2012-11-05 15:24:17

标签: java xml jaxb

我使用JAXB从我的java对象生成xml文件(xml导出),以及另一种方式arround(xml import)。

在某些情况下,我使用"魔法数字"初始化整数类属性,因为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>

我需要告诉JAXB生成&#34;没有&#34; (参见示例)如果属性值是EMPTY_INT而另一种方式是arround(import)。

这有可能吗? 或者还有其他方法可以实现这一目标吗?

感谢您的帮助。 斯特芬

更新:


根据答案我尝试了以下内容:

注意:代码短路(例如没有导入)

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)改编的ExampleClass使用&#34; Integer&#34;而不是&#34; int&#34;并注释它

@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>

谢谢你, 斯特芬

1 个答案:

答案 0 :(得分: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();
        }
    }        
}