2011-09-14 9 views
12

me gustaría configurar JAXB para que se recorta espacios en blanco en todos los campos de cadenaCómo configurar JAXB por lo que recorta los espacios en blanco de forma predeterminada

vi la siguiente respuesta: How to configure JAXB so it trims whitespaces when unmarshalling tag value?

Pero no quiero tener para anotar todos los campos de cadena según la respuesta sugerida

@XmlElement(required=true) 
@XmlJavaTypeAdapter(MyNormalizedStringAdapter.class) 
String name; 

Gracias!

Respuesta

26
  1. Crear un XmlAdapter.

    package com.foo.bar; 
    public class StringTrimAdapter extends XmlAdapter<String, String> { 
        @Override 
        public String unmarshal(String v) throws Exception { 
         if (v == null) 
          return null; 
         return v.trim(); 
        } 
        @Override 
        public String marshal(String v) throws Exception { 
         if (v == null) 
          return null; 
         return v.trim(); 
        } 
    } 
    
  2. Crear un archivo package-info.java en com.foo.bar.

  3. Añadir lo siguiente al archivo

    @XmlJavaTypeAdapter(value=StringTrimAdapter.class,type=String.class) 
    package com.foo.bar; 
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
    
  4. package-info.java Esto se aplicará a StringTrimAdaptertodosString campos en com.foo.bar sin anotaciones adicionales.

EDITAR
tenga en cuenta que si el nivel de anotación paquete es demasiado expansiva para usted, siempre se puede aplicar una anotación @XmlJavaTypeAdapter a clases.

+1

Una respuesta agradable - No puedo hablar sobre el contenido, pero está muy bien escrito. Supongo que Blaise fue a almorzar ;-) –

+0

@Ed Staub - :). Sahil me ganó, hice +1 respuesta de Sahils. –

+0

+1: Esto funciona bien. Ver también [mi respuesta] (http://stackoverflow.com/a/16262197/521799) donde se usa la implementación 'XmlAdapter' de Sahil en una configuración de enlaces XJC. –

7

Puede valer la pena mencionar que, además de escribir XmlAdapter, que realiza el recorte, puede configurar XJC para que realmente use este adaptador en el código generado. Un ejemplo de cómo hacerlo:

<jaxb:globalBindings> 
    <xjc:javaType 
     name="java.lang.String" 
     xmlType="xs:string" 
     adapter="com.foo.bar.StringTrimAdapter"/> 
</jaxb:globalBindings> 

El ejemplo anterior utiliza el XmlAdapter given in Sahil's answer

0

Para hacer el ejemplo de configuración de XJC (in the answer provided by Lukas Eder) completa, me gustaría añadir la siguiente configuración de muestra que tenemos que añadir en pom.xml de Maven

<build> 
    . 
    . 
    <execution> 
     <id>responseSchema</id> 
     <goals> 
      <goal>xjc</goal> 
     </goals> 
     <phase>generate-sources</phase> 
     <configuration> 
      <clearOutputDir>false</clearOutputDir> 
      <outputDirectory>${project.basedir}/src/main/java</outputDirectory> 
      <packageName>com.foo.bar.domain.response</packageName> 
      <bindingFiles>../resources/bindings.xjb</bindingFiles> 
      <schemaDirectory>${project.basedir}/src/main/resources/wsdl/xsd</schemaDirectory> 
      <schemaFiles>response.xsd</schemaFiles> 
      <extension>true</extension> 
     </configuration> 
    </execution> 
    . 
    . 
</build> 

necesitamos tener el siguiente contenido que se añadirán en bindings.xjb.

<jaxb:globalBindings> 
    <xjc:javaType 
     name="java.lang.String" 
     xmlType="xs:string" 
     adapter="com.foo.bar.StringTrimAdapter"/> 
</jaxb:globalBindings> 
Cuestiones relacionadas