Как настроить JAXB, чтобы он по умолчанию обрезал пробелы - PullRequest
13 голосов
/ 14 сентября 2011

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

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

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

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

Спасибо!

Ответы [ 3 ]

28 голосов
/ 14 сентября 2011
  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 в com.foo.bar.

  3. Добавьте следующее в файл package-info.java

    @XmlJavaTypeAdapter(value=StringTrimAdapter.class,type=String.class)
    package com.foo.bar;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
  4. Это будет применяться StringTrimAdapter ко всем String полям в com.foo.barбез каких-либо дополнительных аннотаций.

EDIT
Обратите внимание, что если аннотация уровня пакета слишком обширна для вас, вы всегда можете применить аннотацию @XmlJavaTypeAdapter к классам.

8 голосов
/ 28 апреля 2013

Стоит отметить, что помимо записи XmlAdapter, которая выполняет обрезку, вы можете настроить XJC для фактического использования этого адаптера в сгенерированном коде. Пример того, как это сделать:

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

В приведенном выше примере используется XmlAdapter, указанный в ответе Сахила

0 голосов
/ 19 июня 2015

Чтобы завершить пример настройки XJC (in the answer provided by Lukas Eder), я хотел бы добавить следующий пример конфигурации, который нам нужно добавить в pom.xml

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