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?
My Question was wrong. I had xsi:type="DoublePositive"
instead of type="DoublePositive"
Here is my configuration, which i use to generate classes.
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>
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>
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.