我正在使用 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) 调整 ExampleClass 以使用“Integer”而不是“int”并对其进行注释
@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>
谢谢你,史蒂芬