如何配置JAXB,以便默认情况下修剪空格

时间:2011-09-14 16:45:57

标签: java xml jaxb trim

我想配置JAXB,以便它修剪所有字符串字段上的空格

我看到了以下答案:How to configure JAXB so it trims whitespaces when unmarshalling tag value?

但我不想根据建议的答案注释所有字符串字段

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

谢谢!

3 个答案:

答案 0 :(得分:28)

  1. 创建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. package-info.java

  3. 中创建com.foo.bar个文件
  4. 将以下内容添加到package-info.java文件

    @XmlJavaTypeAdapter(value=StringTrimAdapter.class,type=String.class)
    package com.foo.bar;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
  5. 这会将StringTrimAdapter应用于String中的所有 com.foo.bar字段,而无需任何额外注释。
  6. 修改
    请注意,如果包级别注释过于庞大,您可以始终将@XmlJavaTypeAdapter注释应用于类。

答案 1 :(得分:8)

值得一提的是,除了编写执行修剪的XmlAdapter之外,您还可以将XJC配置为在生成的代码中实际使用此适配器。如何做的一个例子:

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

以上示例使用XmlAdapter given in Sahil's answer

答案 2 :(得分:0)

要完成配置XJC (in the answer provided by Lukas Eder)的示例, 我想添加以下示例配置,我们需要在maven的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>

我们需要在bindings.xjb中添加以下内容。

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