有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java XJC ignore nillable=true

为了避免值被包装在JAXBElement中,我使用以下绑定文件从XSD生成类:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb: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:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
        version="2.1">

    <jaxb:globalBindings generateElementProperty="false">
        <xjc:simple />
    </jaxb:globalBindings>

</jaxb:bindings>

但是,nillable字段存在问题。对于以下XSD:

<!-- ... -->
<xsd:complexType name="getShortCustomerIn">
  <xsd:sequence>
    <xsd:element name="fieldOne" nillable="true" type="xsd:string"/>
    <xsd:element name="fieldTwo" type="xsd:string" minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>
<!-- ... -->

XJC将生成一个包含字段的类:

@XmlElement(required = true, nillable = true)
protected String fieldOne;
@XmlElement(nillable = true)
protected String fieldTwo;

fieldTwonull时,请求将包含一个字段,其中nil设置为true:

<fieldOne>1001714</fieldOne>
<fieldTwo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>

这对于我集成的Web服务来说是一个问题,因为尽管它是一个有效的XML,但它在这样的请求下会阻塞。我已经说过,当一个字段是null时,它就不应该出现在请求中。我意识到为了满足这个要求,生成的类不能将@XmlElement注释的nillable属性设置为true

在使用XJC生成类时,有没有办法忽略XSD文件中的nillable=true


共 (1) 个答案

  1. # 1 楼答案

    将XJC与jaxb2 basics annotate结合使用对我们来说很有效

    pom。xml

    <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <executions>
            <execution>
                <id>jaxb-generate</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>generate</goal>
                </goals>
                <configuration>
                    <schemaDirectory>src/main/schema</schemaDirectory>
                    <bindingDirectory>src/main/schema/bindings</bindingDirectory>
    
                    ...
    
                    <args>
                        <arg>-Xannotate</arg>
                        <arg>-XremoveAnnotation</arg>
                    </args>
    
                    ...
    
                    <plugins>
                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-basics-annotate</artifactId>
                            <version>1.1.0</version>
                        </plugin>
                    </plugins>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    绑定。xjb

    <bindings schemaLocation="sample.xsd">
        <bindings multiple="true" node="//xsd:element[@nillable='true']">
            <annox:annotate target="field">@javax.xml.bind.annotation.XmlElement(nillable = false)</annox:annotate>          
        </bindings>
    </bindings>