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 unmarshalling tag value?
But I do not want to have to annotate all string fields as per the suggested answer
@XmlElement(required=true)
@XmlJavaTypeAdapter(MyNormalizedStringAdapter.class)
String name;
Thanks!
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(); } }
Create a
package-info.java
file incom.foo.bar
.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;
- This will apply
StringTrimAdapter
to allString
fields incom.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.
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
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>
来源:https://stackoverflow.com/questions/7419951/how-to-configure-jaxb-so-it-trims-whitespaces-by-default