2008-12-05 11 views

Antwort

0

Sie können ein Parser/Writer-Paar schreiben und die Eigenschaftenzuordnung in JAXB-XML-Bindungen definieren.

1

Ich würde wahrscheinlich einen Typ Adapter für die Umwandlung eines booleschen in ein int erstellen. Es gibt einige examples im JAXB Benutzerhandbuch.

6

JAXB bietet einen flexiblen Weg zu customize your bindings. Sie müssen lediglich eine XML-Datei schreiben, die angibt, wie Sie Ihre XML- und Java-Typen binden möchten. In Ihrem Fall könnten Sie eine <javaType> Deklaration verwenden, in der Sie eine parseMethod und eine printMethod angeben können. Diese Verfahren könnten so einfach wie

public boolean myParseBool(String s) 
{ 
    return s.equals("1"); 
} 

public String myPrintBool(boolean b) 
{ 
    return b ? "1" : "0"; 
} 

Es könnte einfache Möglichkeiten existiert, vielleicht mit DatatypeConverter, aber ich bin nicht genug bewusst dieses Thema, das Ihnen mehr helfen!

37

Die Adapterklasse:

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class BooleanAdapter extends XmlAdapter<Integer, Boolean> 
{ 
    @Override 
    public Boolean unmarshal(Integer s) 
    { 
     return s == null ? null : s == 1; 
    } 

    @Override 
    public Integer marshal(Boolean c) 
    { 
     return c == null ? null : c ? 1 : 0; 
    } 
} 

Verbrauch:

@XmlElement(name = "enabled") 
@XmlJavaTypeAdapter(BooleanAdapter.class) 
public Boolean getEnabled() 
{ 
    return enabled; 
} 
+0

Excellent! Genau das, was ich brauchte! –

+0

Warum ist das nicht die akzeptierte Antwort? – kasdega

+1

Gibt es ein Rezept, um dies aus der Bindungsdatei für die Generierung auszuführen, aber nicht global für alle booleschen Werte? –

6

das gleiche Problem wie user20298 hatte, folgte ich den Hinweis von mtpettyp und angepasst es für meine Konfiguration.

Meine Konfiguration ist: - Maven, um das Projekt zu bauen. - "org.jvnet.jaxb2.maven2" Plugin in Maven. - jaxb 2.2.6 - Bei dieser Gelegenheit wurde ich mache Java-Klassen für die kml 2.2 (ogckml22.xsd)

Und ich eher zufällig auf dem Problem des booleans als ‚wahr/falsch‘ gemacht werden, wenn Google Maps will, dass sie als '1/0' in maven

Dies ist die Plugin-Konfiguration sein:

<plugin> 
<groupId>org.jvnet.jaxb2.maven2</groupId> 
<artifactId>maven-jaxb2-plugin</artifactId> 
<executions> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
      <goal>generate</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration> 
    <generateDirectory>src/main/generated</generateDirectory> 
    <extension>true</extension> 
    <removeOldOutput>true</removeOldOutput> 
</configuration> 

ich zu dem src/main/resources Ordner eine jaxb-Bindungen hinzugefügt. xjb-Datei mit folgendem Inhalt:

<?xml version="1.0" ?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
      version="2.1" 
      xmlns:kml="http://www.opengis.net/kml/2.2" 
      xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <globalBindings> 
     <xjc:simple/> 
     <xjc:javaType name="java.lang.Boolean" 
         xmlType="xsd:boolean" 
         adapter="path.to.my.JaxbBooleanAdapter"/> 
    </globalBindings> 
    ... 
    ... 
</bindings> 

Die Adapter-Klasse ist wie:

package path.to.my; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

/** 
* Utility class to correctly render the xml types used in JAXB. 
*/ 
public class JaxbBooleanAdapter extends XmlAdapter<String, Boolean> 
{ 
    @Override 
    public Boolean unmarshal(String v) throws Exception 
    { 
     if ("1".equals(v)) 
     { 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public String marshal(Boolean v) throws Exception 
    { 
     if (v == null) 
     { 
      return null; 
     } 
     if (v) 
     { 
      return "1"; 
     } 
     return "0"; 
    } 
} 
+2

Wie wäre es mit der Bindung an nur Boolesche in einer generierten Klasse? Nicht global für alle booleschen Werte. –