我想用jackson
XML映射到地图下面的XML(我有控制的,并从web服务获得)来一个Java bean:如何使用@XmlElements将不同的对象放入同一个列表中?
<foo>
<first><val>some</val></first>
<first><val>somemore</val></first>
<second><testval>test</testval></second>
</foo>
我与提供的模式是:
<xs:schema>
<xs:include schemaLocation="firstType.xsd"/>
<xs:include schemaLocation="secondType.xsd"/>
<xs:element name="foo">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element ref="first" minOccurs="0"/>
<xs:element ref="second" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
使用xsdtojava
,这会产生以下豆:
@XmlRootElement(name = "foo")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlTest {
@XmlElements({
@XmlElement(name = "first", type = FirstType.class),
@XmlElement(name = "second", type = SecondType.class)
})
@JsonSubTypes({
@JsonSubTypes.Type(name = "first", value = FirstType.class),
@JsonSubTypes.Type(name = "second" , value = SecondType.class)
})
private List<IType> items;
//grouping interface
interface IType {
}
@XmlRootElement(name = "first")
@XmlAccessorType(XmlAccessType.FIELD)
class FirstType implements IType {
private String val;
}
@XmlRootElement(name = "second")
@XmlAccessorType(XmlAccessType.FIELD)
class SecondType implements IType {
private String testval;
}
}
但我的测试失败将XML转换!
public static void main(String[] args) throws Exception {
String xml =
"<foo>" +
"<first><val>some</val></first>" +
"<second><testval>test</testval></second>" +
"</foo>";
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
ObjectMapper mapper = builder
.modules(new JaxbAnnotationModule(), new JacksonXmlModule())
.defaultUseWrapper(false)
.createXmlMapper(true)
.build();
XmlTest unmarshal = mapper.readValue(xml, XmlTest.class);
System.out.println(unmarshal.items); //prints 'null'
}
项目的结果列表总是null
,但是为什么? 我试过@XmlElements
和@JsonSubTypes
,但都没有工作。
很好,但因为写的,我*不*修改XML输入,就像我从webservice那里得到的一样!我只能重写我的java bean,它有什么看起来像不变的XML? – membersound
此外,我想依靠'xsdtojava'代替自己定义jaxb模型,因为类可能需要在未来再次自动生成。我能否实现两个列表的自动生成(如你的例子)而不是一个'@ XmlElements'列表? – membersound
好吧,你不能修改你的输入xml,但你可以检查你的代码:你的XmlTest对我来说是不正确的输入XSD。矿正在工作。 – Tuco