How to configure JAXB so it trims whitespaces by default

前端 未结 3 2083
遥遥无期
遥遥无期 2021-01-04 04:31

I would like to configure JAXB so that it trims whitespaces on all string fields

I saw the following answer : How to configure JAXB so it trims whitespaces when unma

相关标签:
3条回答
  • 2021-01-04 04:57
    1. Create a 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. Create a package-info.java file in com.foo.bar.

    3. Add the following to the package-info.java file

      @XmlJavaTypeAdapter(value=StringTrimAdapter.class,type=String.class)
      package com.foo.bar;
      import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
      
    4. This will apply StringTrimAdapter to all String fields in com.foo.bar without any extra annotations.

    EDIT
    Do note that if the package level annotation is too expansive for you, you could always apply a @XmlJavaTypeAdapter annotation to classes.

    0 讨论(0)
  • 2021-01-04 04:57

    To make the example of configuring XJC (in the answer provided by Lukas Eder) complete, i would like to add the following sample configuration which we need to add in maven's pom.xml

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

    We need to have the following content to be added in bindings.xjb.

    <jaxb:globalBindings>
        <xjc:javaType 
             name="java.lang.String" 
             xmlType="xs:string" 
             adapter="com.foo.bar.StringTrimAdapter"/>
    </jaxb:globalBindings>
    
    0 讨论(0)
  • 2021-01-04 04:59

    It might be worth mentioning, that in addition to writing an XmlAdapter, which performs the trimming, you can configure XJC to actually use this adapter in generated code. An example of how to do it:

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

    The above example uses the XmlAdapter given in Sahil's answer

    0 讨论(0)
提交回复
热议问题