[英]JAXB: Use @XmlIDREF on a Map
I'm trying to marshall some data with JAXB. 我正在尝试使用JAXB整理一些数据。 My problem is the following: I have a class Frame which contains a map of signals. 我的问题如下:我有一个Frame类,其中包含信号映射。
@XmlRootElement(name = "frame")
@XmlAccessorType(XmlAccessType.FIELD)
public class Frame extends V_Element {
@XmlElementWrapper(name = "signals")
private Map<Signal, Double> signals;
}
So far the XML output is: 到目前为止,XML输出是:
<frame id="ee61b926-a1ca-4462-ac58-77d3ac0cbe5e" name="F1">
<signals>
<entry>
<key id="7352beaa-1921-4bfe-b1ce-3d8dabe69e8b" name="Signal1">
<properties/>
<bitLength>0</bitLength>
<frame>3ee61b926-a1ca-4462-ac58-77d3ac0cbe5e</frame>
</key>
<value>1.0</value>
</entry>
</signals>
</frame>
But instead i want to have the following schema: 但是我想拥有以下架构:
<frame id="3ee61b926-a1ca-4462-ac58-77d3ac0cbe5e" name="F1">
<signals>
<signal pos= "1.0">7352beaa-1921-4bfe-b1ce-3d8dabe69e8b</sgnal>
</signals>
</frame>
Under the frame tag i want just to have the signal ID and the pos value as an attribute. 在帧标签下,我只想将信号ID和pos值作为属性。 The @XmlIDREF
annotation doesn't work on a Map. @XmlIDREF
批注不适用于地图。
The relation between Signal and Frame is a many-to-many relationship so a Signal has a different position in different Frames. 信号与帧之间的关系是多对多关系,因此信号在不同帧中的位置不同。 Any leads ? 有线索吗?
In order to get that kind of output your POJOs might look like 为了获得这种输出,您的POJO可能看起来像
@XmlAccessorType(XmlAccessType.FIELD)
public class Signal {
@XmlAttribute(name = "pos", required=true)
private Double pos;
@XmlValue
private String id;
public String getId(){
return id;
}
public Double getPos(){
return pos;
}
public void setPos(Double p){
pos = p;
}
public void setId(String id){
this.id = id;
}
}
public class SignalWrapper {
@XmlElement(name="signal", required=true)
private List<Signal> signalList;
public List<Signal> getSignalList(){
if(signalList == null)
signalList = new ArrayList<>();
return signalList;
}
//no setter for Signal list is necessary
}
@XmlRootElement(name="frame")
@XmlAccessorType(XmlAccessType.FIELD)
public class Frame {
@XmlAttribute(name="id", required=true)
private String id;
@XmlAttribute(name="name", required=true)
private String name;
@XmlElement(name="signals", required=true)
private SignalWrapper sigWrapper;
public String getId(){
return id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public void setId(String id){
this.id = id;
}
public SignalWrapper getSigWrapper(){
return sigWrapper;
}
public void setSignalWrapper(SignalWrapper sw){
sigWrapper = sw;
}
}
Your test code might look like 您的测试代码可能看起来像
final String ENT_XML = "C:\\test\\Signal.xml";
JAXBContext context = JAXBContext.newInstance(Frame.class);
Marshaller m = context.createMarshaller();
Signal s = new Signal();
s.setId("7352beaa-1921-4bfe-b1ce-3d8dabe69e8b");
s.setPos(2.0);
SignalWrapper sw = new SignalWrapper();
List<Signal> sl = sw.getSignalList();
sl.add(s);
Frame f = new Frame();
f.setSignalWrapper(sw);
f.setId("3ee61b926-a1ca-4462-ac58-77d3ac0cbe5e");
f.setName("F1");
m.marshal(f, new File(ENT_XML));
I've managed to get the schema that i wanted. 我设法获得了想要的架构。 I have added a class SignalPos 我添加了一个SignalPos类
public class SignalPos {
@XmlAttribute(name = "id")
@XmlIDREF
private Signal signal;
@XmlAttribute
private Double pos;
public SignalPos() {
}
public SignalPos(Signal s, double pos) {
this.signal = s;
this.pos = pos;
}
public Signal getSignal() {
return signal;
}
public Double getPos() {
return pos;
}
}
And in the Frame class 在框架类中
public class Frame {
@XmlElementWrapper(name = "signals")
@XmlElement(name = "signal")
private List<SignalPos> signals;
}
The output: 输出:
<signals>
<signal id="d1c23562-d02c-439a-8e7b-d4222c7750c8" pos="23.0"/>
<signal id="932d8850-36e3-467b-8a62-1e0ae6bb271a" pos="2.0"/>
<signal id="2e6a99b2-95f8-4a5f-bf44-1ce948839e9d" pos="1.0"/>
</signals>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.