2008-12-05 12 views

Respuesta

0

Puede escribir un par de analizadores/escritores y definir la asignación de propiedades en el enlace de JAXB XML.

1

Probablemente crearía un adaptador de tipo para convertir un booleano en un int. Hay algunos examples en la guía de usuarios de JAXB.

6

JAXB ofrece una forma flexible de customize your bindings. Simplemente tiene que escribir un archivo XML que indicará cómo desea vincular sus tipos XML y Java. En su caso, podría usar una declaración <javaType>, en la que puede especificar un parseMethod y un printMethod. Estos métodos pueden ser tan simples como

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

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

podrían existir formas más sencillas, tal vez utilizando DatatypeConverter, pero no soy lo suficientemente consciente de este tema para ayudar más!

37

La clase adaptador:

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; 
    } 
} 

Uso:

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

Excelente! ¡Justo lo que necesitaba! –

+0

¿Por qué no es esta la respuesta aceptada? – kasdega

+1

¿Hay una receta para hacer esto desde el archivo de enlaces para la generación, pero no globalmente en todos los booleanos? –

6

Tener el mismo problema que user20298, I siguió la pista por mtpettyp, y adaptado para mi configuración.

Mi configuración es: - maven para construir el proyecto. - complemento "org.jvnet.jaxb2.maven2" en maven. - jaxb 2.2.6 - En esta ocasión, yo estaba haciendo clases de Java para el kml 2,2 (ogckml22.xsd)

Y me encontré con el problema de los booleanos que se representa como 'verdadero/falso', cuando los mapas de Google quiere que sean como '1/0'

Ésta es la configuración del plugin de Maven:

<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> 

que añaden a las src/main/resources carpeta a JAXB encuadernaciones. archivo xjb con el siguiente contenido:

<?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> 

La clase de adaptador es como:

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

¿Qué tal aplicar el enlace a solo booleanos en una clase generada? No globalmente para todos los booleanos. –

Cuestiones relacionadas