【问题标题】:How to prevent autogeneration of JAXBElement for xs:choice using xsdtojava?如何防止使用 xsdtojava 为 xs:choice 自动生成 JAXBElement?
【发布时间】:2017-11-28 08:18:08
【问题描述】:

我正在使用 cxf-xjc-pluginxsdtojava 插件从 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 指定例如允许使用两个 &lt;creditcard&gt; 元素。
  • 没错,我将字段更改为List&lt;&gt; 元素。无论如何,唯一的问题仍然是如何防止将JAXBElement 生成为whatever

标签: java xml xsd jaxb jackson


【解决方案1】:

解决方案是使用simplify jaxb 插件并使用&lt;simplify:as-element-property/&gt; 生成选择元素。

行家:

<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>

选择绑定.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>

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 2019-03-10
    • 2015-04-12
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多