Haben Sie eine kurze Frage. Kann jemand JAXB (Marshall) boolesche Felder wie 1 und 0 rendern, anstatt "wahr" und "falsch" auszudrucken?Wie JAXB rendern boolean als 0 und 1, nicht wahr und falsch
Antwort
Sie können ein Parser/Writer-Paar schreiben und die Eigenschaftenzuordnung in JAXB-XML-Bindungen definieren.
Ich würde wahrscheinlich einen Typ Adapter für die Umwandlung eines booleschen in ein int erstellen. Es gibt einige examples im JAXB Benutzerhandbuch.
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!
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;
}
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";
}
}
Wie wäre es mit der Bindung an nur Boolesche in einer generierten Klasse? Nicht global für alle booleschen Werte. –
Excellent! Genau das, was ich brauchte! –
Warum ist das nicht die akzeptierte Antwort? – kasdega
Gibt es ein Rezept, um dies aus der Bindungsdatei für die Generierung auszuführen, aber nicht global für alle booleschen Werte? –