我正在使用 cxf-xjc-plugin
和 xsdtojava
插件从 XSD
生成 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;
我尝试通过使用绑定(bind)文件来实现此目的:
<?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/>
生成选择元素.
行家:
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
</dependency>
xsdtojava maven 配置 cxf-xjc-plugin
必须使用:
<xsdOption>
<bindingFile>${project.basedir}/src/main/resources/choice-binding.xml</bindingFile>
<extensionArgs>
<extensionArg>-Xsimplify</extensionArg>
</extensionArgs>
</xsdOption>
选择绑定(bind).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 - 如何防止 xs :choice using xsdtojava? 自动生成 JAXBElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47526881/