我遇到以下源代码问题。 在解组"简单"上课,属性"内容"从"内容"创建tag为null。我的意思是"内容"财产没有得到价值" 123456"来自xml。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Simple", propOrder = {
"content"})
public class Simple extends Valor{
@XmlElements({
@XmlElement(name="content",type=String.class),
@XmlElement(name="content",type=Integer.class),
})
protected Object content;
//getters y setters
}
file.xml
<simple>
<content>
123456
<content>
</simple>
勇气等级
@XmlSeeAlso({
Varios.class,
Simple.class,
Grilla.class
})
@XmlTransient
public abstract class Valor {
public abstract String getValorString();
}
有什么想法? 提前谢谢!
为我所拥有的问题增加一些清晰度。如果我把Simple类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Simple", propOrder = {
"content"})
public class Simple extends Valor{
@XmlElements({
@XmlElement(name="content",type=String.class),
@XmlElement(name="content",type=Integer.class),
})
protected Object content;
//getters y setters
}
如果xml是:
<simple>
<content>
123456
</content>
</simple>
输出是:
123456
但如果xml是:
<simple>
<content>
Hi!!
</content>
</simple>
输出是:
null
现在,如果是Simple类,请按照以下代码交换XmlElements:
@XmlElements({
@XmlElement(name="content",type=Integer.class),
@XmlElement(name="content",type=String.class)
})
protected Object content;
如果xml是:
<simple>
<content>
123456
</content>
</simple>
输出是:
null
但如果xml是:
<simple>
<content>
Hi!!
</content>
</simple>
输出是:
Hi!!
答案 0 :(得分:1)
我还没有能够重现你所看到的。以下是我的尝试。
<强>简单强>
以下是我为Simple
课程实施的内容。
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Simple", propOrder = {
"content"})
public class Simple extends Valor{
@XmlElements({
@XmlElement(name="content",type=String.class),
@XmlElement(name="content",type=Integer.class),
})
protected Object content;
public Object getContent() {
return content;
}
@Override
public String getValorString() {
throw new UnsupportedOperationException();
}
public void setContent(Object content) {
this.content = content;
}
}
<强> input.xml中强>
下面是输入文档,其中content
的关闭标记已更正。
<simple>
<content>
123456
</content>
</simple>
<强>演示强>
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Simple.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource source = new StreamSource("src/forum22911170/input.xml");
Simple simple = unmarshaller.unmarshal(source, Simple.class).getValue();
System.out.println(simple.getContent());
}
}
<强>输出强>
以下是运行演示代码的输出:
123456
<强>更新强>
您遇到的问题是@XmlElements
注释中的两个选项都映射到同一个元素content
。对于解组,JAXB将根据具有该名称的第一个@XmlElement
处理该元素。在下面的情况下,它会始终将其视为String
,它会颠倒它始终将其视为Integer
的顺序。
@XmlElements({
@XmlElement(name="content",type=String.class),
@XmlElement(name="content",type=Integer.class),
})
protected Object content;
正确的用法是将它们映射到不同的元素,例如
@XmlElements({
@XmlElement(name="FOO",type=String.class),
@XmlElement(name="BAR",type=Integer.class),
})
protected Object content;