jaxb2-maven-plugin generates invalid source for doubles with default value =INF

☆樱花仙子☆ 提交于 2019-12-11 03:05:06

问题


I have a problem where the jaxb2-maven-plugin generates invalid source code when the XSD file contains default values for doubles.

I use the jaxb2-maven-plugin (org.codehaus.mojo) version 1.5:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>1.5</version>
    <configuration>
    </configuration>
    <executions>
        <execution>
            <id>analysis_jaxb</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <clearOutputDir>false</clearOutputDir>
                <schemaFiles>Analysis.xsd</schemaFiles>
                <packageName>xx.xx.xx.analysis</packageName>
                <generateDirectory>${project.build.directory}/generated-sources/jaxb/analysis</generateDirectory>
                <verbose>true</verbose>
            </configuration>
        </execution>
    </executions>
</plugin>

to generate Java Source from the following XSD file:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:element name="MinMax" type="MinMaxType"/>

    <xs:complexType name="MinMaxType">
        <xs:attribute name="min" type="xs:double" default="-INF" />
        <xs:attribute name="max" type="xs:double" default="INF" />
    </xs:complexType>

</xs:schema> 

The resulting Java file contains this method:

public double getMin() {
    if (min == null) {
        return -InfinityD; //UNDEFINED
    } else {
        return min;
    }
}

The field -InfinityD is not defined anywhere.

When using booleans (e.g. <xs:attribute name="minInclusive" type="xs:boolean" default="false" />) the default values work as expected.

In contrast to this, the plugin org.jvnet.jaxb2.maven2 (maven-jaxb2-plugin) would write Double.POSITIVE_INFINITY on that problematic line.

Is this simply not supported? Am I missing a parameter?


回答1:


Using this XSD...

<xs:schema attributeFormDefault="unqualified"
    targetNamespace="yourNameSpace"
    xmlns:a="yourNameSpace"
    elementFormDefault="qualified" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="MinMax" type="a:MinMaxType"/>

    <xs:complexType name="MinMaxType">
        <xs:attribute name="min" type="xs:double" default="-INF" />
        <xs:attribute name="max" type="xs:double" default="INF" />
    </xs:complexType>
</xs:schema>

If you use

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.9.0</version>

works fine

output:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MinMaxType")
public class MinMaxType {

    @XmlAttribute(name = "min")
    protected Double min;
    @XmlAttribute(name = "max")
    protected Double max;

    /**
     * Recupera il valore della proprietà min.
     * 
     * @return
     *     possible object is
     *     {@link Double }
     *     
     */
    public double getMin() {
        if (min == null) {
            return java.lang.Double.NEGATIVE_INFINITY;
        } else {
            return min;
        }
    }

    /**
     * Imposta il valore della proprietà min.
     * 
     * @param value
     *     allowed object is
     *     {@link Double }
     *     
     */
    public void setMin(Double value) {
        this.min = value;
    }

    /**
     * Recupera il valore della proprietà max.
     * 
     * @return
     *     possible object is
     *     {@link Double }
     *     
     */
    public double getMax() {
        if (max == null) {
            return java.lang.Double.POSITIVE_INFINITY;
        } else {
            return max;
        }
    }

    /**
     * Imposta il valore della proprietà max.
     * 
     * @param value
     *     allowed object is
     *     {@link Double }
     *     
     */
    public void setMax(Double value) {
        this.max = value;
    }

}

plugin configuration:

            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.9.0</version>
                <executions>
                    <execution>
                        <id>commun-generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <generateDirectory>${basedir}/src/main/java/</generateDirectory>
                            <schemaDirectory>${basedir}/src/main/resources/schema/xsd</schemaDirectory>
                            <strict>true</strict>
                            <extension>true</extension>
                            <verbose>true</verbose>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

Using jaxb2-maven-plugin

plugin configuration:

           <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>1.6</version>
                <configuration>
                </configuration>
                <executions>
                    <execution>
                        <id>analysis_jaxb</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                        <configuration>
                            <clearOutputDir>false</clearOutputDir>
                            <schemaFiles>your.xsd</schemaFiles>
                            <packageName>xx.xx.xx.analysis</packageName>
                            <generateDirectory>generated-sources/jaxb/analysis</generateDirectory>
                            <verbose>true</verbose>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

output

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MinMaxType")
public class MinMaxType {

    @XmlAttribute(name = "min")
    protected Double min;
    @XmlAttribute(name = "max")
    protected Double max;

    /**
     * Recupera il valore della proprietà min.
     * 
     * @return
     *     possible object is
     *     {@link Double }
     *     
     */
    public double getMin() {
        if (min == null) {
            return java.lang.Double.NEGATIVE_INFINITY;
        } else {
            return min;
        }
    }

    /**
     * Imposta il valore della proprietà min.
     * 
     * @param value
     *     allowed object is
     *     {@link Double }
     *     
     */
    public void setMin(Double value) {
        this.min = value;
    }

    /**
     * Recupera il valore della proprietà max.
     * 
     * @return
     *     possible object is
     *     {@link Double }
     *     
     */
    public double getMax() {
        if (max == null) {
            return java.lang.Double.POSITIVE_INFINITY;
        } else {
            return max;
        }
    }

    /**
     * Imposta il valore della proprietà max.
     * 
     * @param value
     *     allowed object is
     *     {@link Double }
     *     
     */
    public void setMax(Double value) {
        this.max = value;
    }

}


来源:https://stackoverflow.com/questions/26337076/jaxb2-maven-plugin-generates-invalid-source-for-doubles-with-default-value-inf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!