我有一个Java bean ala
@XmlRootElement public class Bean {
@XmlElementWrapper(name = "ints") @XmlElement(name = "int")
int[] values;
// constructors, getters, setters, etc...
}
JAXB正在生成类似
的XML<bean>
<ints>
<int>12</int>
<int>34</int>
<int>56</int>
</ints>
</bean>
我希望数组索引包含在<int>
标记中,因为数组位置传达了重要的值。最好是像
<bean>
<ints>
<int id='0'>12</int>
<int id='1'>34</int>
<int id='2'>56</int>
</ints>
</bean>
有办法做到这一点吗?
答案 0 :(得分:7)
XML元素的顺序携带信息。元素序列具有明确的顺序,因此添加数组索引将是多余的,除非您计划跳过索引或使它们无序。
由于这种推理,JAXB无法自动执行您所要求的操作。如果您仍想这样做,则需要将值包装在一个将索引值合并为@XmlAttribute
值的类中:
@XmlRootElement
public class Bean {
@XmlElementWrapper(name = "ints")
@XmlElement(name = "int")
MyInt[] values;
// constructors, getters, setters, etc...
}
public class MyInt {
@XmlAttribute(name="id")
int id;
@XmlValue
int value;
}
由您决定是否正确填充id
字段。
答案 1 :(得分:4)
您也可以使用XmlAdapter
执行此操作将Bean类更改为:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Bean {
@XmlElement(name = "ints")
@XmlJavaTypeAdapter(IndexAdapter.class)
int[] values;
}
@XmlJavaTypeAdapter允许您将属性转换为JAXB将封送的另一个对象。这与上面提到的类似,不需要更改模型。适配器看起来像:
import javax.xml.bind.annotation.adapters.XmlAdapter;
import forum.AdaptedArray.AdaptedArrayValue;
public class IndexAdapter extends XmlAdapter<AdaptedArray, int[]>{
@Override
public AdaptedArray marshal(int[] v) throws Exception {
AdaptedArray adaptedArray = new AdaptedArray();
for(int x=0; x<v.length; x++) {
adaptedArray.addValue(x, v[x]);
}
return adaptedArray;
}
@Override
public int[] unmarshal(AdaptedArray v) throws Exception {
int[] intArray = new int[v.ints.size()];
for(AdaptedArrayValue adaptedArrayValue : v.ints) {
intArray[adaptedArrayValue.index] = adaptedArrayValue.value;
}
return intArray;
}
}
改编后的价值类看起来像:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlValue;
public class AdaptedArray {
@XmlElement(name="int")
List<AdaptedArrayValue> ints = new ArrayList<AdaptedArrayValue>();;
public void addValue(int index, int value) {
AdaptedArrayValue adaptedArrayValue = new AdaptedArrayValue();
adaptedArrayValue.index = index;
adaptedArrayValue.value = value;
ints.add(adaptedArrayValue);
}
public static class AdaptedArrayValue {
@XmlAttribute int index;
@XmlValue int value;
}
}