java - 如何防止 xs :choice using xsdtojava? 自动生成 JAXBElement

标签 java xml xsd jaxb jackson

我正在使用 cxf-xjc-pluginxsdtojava 插件从 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/

相关文章:

java - XSD XML 架构中 maxOccurs 的最大整数是多少?

java - Neo4j java 高 cpu 使用率仍然是 392%

java - 这里的内存复杂度是O(1)还是O(N)?

java - FirebaseListAdapter 不为聊天应用程序推送单个项目 - Firebase-Ui 3.1

java - 使用 Java DOM 解析器对 XML 输出进行标记 - 多个子节点值

java - xjc 和 XSD 的选择

c# - 将复杂的 XML 反序列化为 C# 对象

java - 如何在 Infinispan 中使用 JTA 事务?

指定字符串长度范围的 RegEx : XSD attribute element

xml - 如何在 Angular 4 中将 xml 转换为 json?