4 Stimmen

Benötige nullbaren Double-Wert

Ich verwende ein xsd-Schema mit einem Elementdatentyp double wie diese:

<xsd:element name="value" type="xsd:double"/>

Ich verwende den jaxB Unmarschaller, um eine Java-Klasse mit dem entsprechenden Objekt und Attributen zu erstellen. Das Ergebnis sieht wie folgt aus:

protected double value;

Nun können die Xml-Daten nullbare Wertelemente senden, aber ich bin nicht in der Lage, das Xsd-Schema an den Datentyp Double.class anzupassen. Ist es möglich, das Attribut in der Java-Klasse zu überschreiben?

1voto

bdoughan Punkte 144925

Wenn Sie das XML-Schema nicht ändern können, um das value-Element abschaltbar zu machen, können Sie Folgendes mit einer externen JAXB-Bindungsdatei tun:

Externe Bindungsdatei (binding.xml)

Sie könnten eine externe Bindungsdatei wie die folgende verwenden:

<jaxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jaxb:extensionBindingPrefixes="xjc"
    version="2.1">
    <jaxb:bindings schemaLocation="double.xsd">
        <jaxb:bindings node="//xs:element[@name='value']">
            <jaxb:property>
                <jaxb:baseType name="java.lang.Double"/>
            </jaxb:property>
      </jaxb:bindings>
   </jaxb:bindings>
</jaxb:bindings>

XML-Schema - double.xsd

Die obige Bindungsdatei gilt für ein XML-Schema, das wie folgt aussieht:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="value" type="xs:double"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

XJC-Anruf

xjc -d out -b binding.xml double.xsd

Generierte Klasse

package generated;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"value"})
@XmlRootElement(name = "Root")
public class Root {

    @XmlElement(required = true, type = Double.class)
    protected Double value;

    public Double getValue() {
        return value;
    }

    public void setValue(Double value) {
        this.value = value;
    }

}

1voto

beny23 Punkte 33277

Wenn nicht löschbare Elemente gesendet werden, sollte das Schema wirklich sein:

<xsd:element name="value" type="xsd:double" nillable="true" />

Dann sollte JAXB eine Double anstelle einer double .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X