我有一个类,是这样的:
public class Property {
private double floorArea;
public double getFloorArea() {
return floorArea;
}
@XmlElement
public void setFloorArea(double floorArea) {
this.floorArea = floorArea;
}
}
这会给我这样的东西:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property>
<floorArea>x</floorArea>
</property>
但是我需要这样的东西:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property>
<floorArea>
<value>x</value>
</floorArea>
</property>
我使用的 API 需要这样。我有限的 JAXB 知识使我无法弄清楚这一点。感谢您的帮助。
编辑:
我正在研究的东西。我是否需要创建一个带有自己的 JAXB 注释的 value
类才能工作? (并将 floorArea
设置为 value
的类型)?
最佳答案
下面是如何通过使用任何 JAXB (JSR-222) 实现的 XmlAdapter
来支持您的用例。
XmlAdapter (DoubleValueAdapter)
XmlAdapter
是一种允许将对象转换为另一种类型的对象的机制。然后是转换为 XML 或从 XML 转换的转换对象。
package forum14045961;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DoubleValueAdapter extends XmlAdapter<DoubleValueAdapter.AdaptedDoubleValue, Double>{
public static class AdaptedDoubleValue {
public double value;
}
@Override
public AdaptedDoubleValue marshal(Double value) throws Exception {
AdaptedDoubleValue adaptedDoubleValue = new AdaptedDoubleValue();
adaptedDoubleValue.value = value;
return adaptedDoubleValue;
}
@Override
public Double unmarshal(AdaptedDoubleValue adaptedDoubleValue) throws Exception {
return adaptedDoubleValue.value;
}
}
属性(property)
@XmlJavaTypeAdapter
注释用于指定XmlAdapter
。我需要将 double
更改为 Double
,因此我将映射移至该字段,以免影响公共(public) API。
package forum14045961;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Property {
@XmlJavaTypeAdapter(DoubleValueAdapter.class)
private Double floorArea;
public double getFloorArea() {
return floorArea;
}
public void setFloorArea(double floorArea) {
this.floorArea = floorArea;
}
}
演示
下面是一些演示代码来证明一切正常。
package forum14045961;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Property.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14045961/input.xml");
Property property = (Property) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(property, System.out);
}
}
input.xml/输出
下面是演示代码的输入和输出。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property>
<floorArea>
<value>1.23</value>
</floorArea>
</property>
关于java - JAXB - 元素值字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14045961/