Подтвердить что ты не робот

Как настроить JAXB, чтобы он обрезал пробелы по умолчанию

Я хотел бы настроить JAXB так, чтобы он обрезал пробелы во всех строковых полях

Я увидел следующий ответ: Как настроить JAXB, чтобы он обрезал пробелы при значении unmarshalling tag?

Но я не хочу, чтобы комментировать все строковые поля в соответствии с предлагаемым ответом

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

Спасибо!

4b9b3361

Ответ 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>