【发布时间】:2017-11-28 08:18:08
【问题描述】:
我正在使用 cxf-xjc-plugin 和 xsdtojava 插件从 XSD 生成 java 类。
问题:我无法控制xsd,并且一个元素有一个xs:choice,这会导致JAXBElement。不幸的是,我的 xml 序列化程序 jackson 无法处理 JAXBElements。所以我试图实现自动生成到Object 而不是JAXBElement。但是怎么做呢?
我无法控制的xsd:
<xs:element name="payment">
<xs:complexType>
<xs:choice maxOccurs="2">
<xs:element name="creditcard">
...
</xs:element>
<xs:element name="debitcard">
...
</xs:element>
<xs:element name="iban">
...
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
xsdtojava 生成:
@XmlRootElement
public class AutogeneratedReq {
@XmlElementRefs({
@XmlElementRef(name = "creditcard", type = JAXBElement.class, required = false),
@XmlElementRef(name = "debitcard", type = JAXBElement.class, required = false),
@XmlElementRef(name = "iban", type = JAXBElement.class, required = false)
})
private List<JAXBElement<?>> payment;
}
但我的目标如下:
@XmlElements({
@XmlElement(name="creditcard", type=Creditcad.class, required = false),
@XmlElement(name="debitcard", type=Debitcard.class, required = false),
@XmlElement(name="iban", type=Iban.class, required = false)
})
protected List<Object> payment;
或者也可以将每个选项生成为单个元素:
private List<Ceditcard> creditcard;
private List<Debitcard> debitcard;
private List<Iban> iban;
我尝试通过使用绑定文件来实现这一点:
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<globalBindings choiceContentProperty="true"/>
</bindings>
但这并没有帮助。我还可以尝试什么?
【问题讨论】:
-
单个字段不适合 XSD,因为 XSD 指定例如允许使用两个
<creditcard>元素。 -
没错,我将字段更改为
List<>元素。无论如何,唯一的问题仍然是如何防止将JAXBElement生成为whatever。