Как настроить JAXB, чтобы он обрезал пробелы по умолчанию
Я хотел бы настроить JAXB так, чтобы он обрезал пробелы во всех строковых полях
Я увидел следующий ответ: Как настроить JAXB, чтобы он обрезал пробелы при значении unmarshalling tag?
Но я не хочу, чтобы комментировать все строковые поля в соответствии с предлагаемым ответом
@XmlElement(required=true)
@XmlJavaTypeAdapter(MyNormalizedStringAdapter.class)
String name;
Спасибо!
Ответы
Ответ 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();
}
}
-
Создайте файл package-info.java
в com.foo.bar
.
-
Добавьте в файл package-info.java
следующее:
@XmlJavaTypeAdapter(value=StringTrimAdapter.class,type=String.class)
package com.foo.bar;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
- Это применит поля
StringTrimAdapter
to all String
в com.foo.bar
без каких-либо дополнительных аннотаций.
ИЗМЕНИТЬ
Обратите внимание, что если аннотация для уровня пакета слишком велика для вас, вы всегда можете применить аннотацию @XmlJavaTypeAdapter
к классам.
Ответ 2
Возможно, стоит отметить, что помимо написания XmlAdapter
, который выполняет обрезку, вы можете настроить XJC для фактического использования этого адаптера в сгенерированном коде, Пример того, как это сделать:
<jaxb:globalBindings>
<xjc:javaType
name="java.lang.String"
xmlType="xs:string"
adapter="com.foo.bar.StringTrimAdapter"/>
</jaxb:globalBindings>
В приведенном выше примере используется XmlAdapter
в ответе Сахила
Ответ 3
Чтобы сделать пример конфигурации 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>