javaxsdxjcxml-binding

XJC restriction convert Double to String


i read XML by generated javax.xml.bind-Annotated classes from XSD.

<xsd:complexType name="foo">
  <xsd:attribute name="bar" type="xsd:double" />
</xsd:complexType>

So my class is generated to:

public Double getBar(){....}

Ok, to ensure a double-Attribute is positive, i use xsd:restriction.

<xsd:simpleType name="DoublePositive">
  <xsd:restriction base="xsd:double">
    <xsd:minExclusive value="0" />
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="foo">
  <xsd:attribute name="bar" type="DoublePositive" />
</xsd:complexType>

Too bad, xjc generate a String instead of a Double.

public String getBar(){....}

Can i Force to use Double instead of String?

Solution:

My Question was wrong. I had xsi:type="DoublePositive" instead of type="DoublePositive"


Solution

  • Here is my configuration, which i use to generate classes.

    1. test.xsd - your xsd file

       <?xml version="1.0" encoding="utf-8"?>
       <xsd:schema elementFormDefault="qualified" targetNamespace=""
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      
         <xsd:simpleType name="DoublePositive">
           <xsd:restriction base="xsd:double">
             <xsd:minExclusive value="0"/>
           </xsd:restriction>
         </xsd:simpleType>
      
         <xsd:complexType name="foo">
           <xsd:attribute name="bar" type="DoublePositive"/>
         </xsd:complexType>
       </xsd:schema>
      
    2. text.xml - file with global bindings.

      <jaxb:bindings version="2.1"
                      xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                      xmlns:xs="http://www.w3.org/2001/XMLSchema">
      
         <jaxb:globalBindings generateElementProperty="false">
           <jaxb:javaType name="java.util.Double" xmlType="DoublePositive"
                          parseMethod="Converter.fromString"
                          printMethod="Converter.toString"/>
         </jaxb:globalBindings> 
       </jaxb:bindings>
      
    3. Converter.java - class with conversion functions.

      public class Converter {
        public static Double fromString(String str){
          return Double.parseDouble(str);
        }
      
        public static String toString(Double value){
          return String.valueOf(value);
        }
      }
      

    That's all. Call xjc with command

    xjc -b test.xml -classpath . test.xsd.

    $ xjc -version
    xjc version "JAXB 2.1.10" 
    JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build JAXB 2.1.10)
    $ xjc -b test.xml -classpath . test.xsd 
    parsing a schema... 
    [WARNING] EmptyTargetNamespace: In schema document 'file:/pwd/test.xsd', the
    value of the 'targetNamespace' attribute cannot be an empty string.  
    line 3 of file:/pwd/test.xsd
    
    compiling a schema... 
    generated/Adapter1.java
    generated/Foo.java
    generated/ObjectFactory.java 
    
    

    and generated file content:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "foo")
    public class Foo {
    
        @XmlAttribute
        @XmlJavaTypeAdapter(Adapter1 .class)
        protected Double bar;
    
        /**
         * Gets the value of the bar property.
         * 
         * @return
         *     possible object is
         *     {@link String }
         *     
         */
        public Double getBar() {
            return bar;
        }
    
        /**
         * Sets the value of the bar property.
         * 
         * @param value
         *     allowed object is
         *     {@link String }
         *     
         */
        public void setBar(Double value) {
            this.bar = value;
        }
    
    }
    

    and Adapter class

    package generated;
    
    import java.util.Double;
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    public class Adapter1
        extends XmlAdapter<String, Double>
    {
    
    
        public Double unmarshal(String value) {
            return (Converter.fromString(value));
        }
    
        public String marshal(Double value) {
            return (Converter.toString(value));
        }
    
    }
    

    So, as you can see, xjc generates the classes correctly. If you still get a String, then maybe you forgot to add something in your configuration. But without the details about your configuration, it is impossible to say what is wrong with your code.