我想用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