我正在使用XSD
和cxf-xjc-plugin
插件从xsdtojava
生成Java类。
问题:我无法控制xsd
,并且一个元素具有xs:choice
,这会导致JAXBElement
。不幸的是,我的xml序列化程序jackson
无法处理JAXBElement
。因此,我正在尝试实现自动生成为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>
但这没有帮助。我还能尝试什么?
最佳答案
解决方案是使用simplify
jaxb插件并使用<simplify:as-element-property/>
生成choice元素。
专家
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
</dependency>
具有
cxf-xjc-plugin
的xsdtojava maven配置必须使用:<xsdOption>
<bindingFile>${project.basedir}/src/main/resources/choice-binding.xml</bindingFile>
<extensionArgs>
<extensionArg>-Xsimplify</extensionArg>
</extensionArgs>
</xsdOption>
choice-binding.xml:
axb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:simplify="http://jaxb2-commons.dev.java.net/basic/simplify"
jaxb:extensionBindingPrefixes="xjc simplify"
jaxb:version="2.1">
<jaxb:bindings schemaLocation="xsd/booking/bookingRequest.xsd">
<jaxb:bindings multiple="true" node="//xs:element[@name='payment']//xs:complexType//xs:choice//xs:element">
<simplify:as-element-property/>
</jaxb:bindings>
</jaxb:binding>
</jaxb:bindings>
关于java - 如何使用xsdtojava防止xs:choice的JAXBElement自动生成?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47526881/