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

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

Например, давайте рассмотрим простую привязку между Java-бином и XML с использованием аннотаций JAXB:

@XmlRootElement(name="bean")
class Bean {

  @XmlElement(required=true)
  String name;

  @XmlElement(required=true)
  int number;
}

Я хотел бы иметь возможность демонтировать XML, указанный ниже, поэтому bean.name не включает начальные и конечные пробелы - это « Мое имя », а не « \ n Мое имя \ n ».

<bean>
  <name>
    My name
  </name>
  <number>1</number>
</bean>
11.12.2008 13:22:16
к сожалению, синтаксический анализатор XML воспринимает это как «значительный» пробел, если вы можете отформатировать вывод без разрывов строк, что будет проще, чем все остальные обручи ...
escape-llc 26.10.2015 16:45:29
2 ОТВЕТА
РЕШЕНИЕ

Используйте пользовательский класс адаптера . Я думал, что NormalizedStringAdapter сделает эту работу, но это только для демаршалинга, и в любом случае он не делает то, что вы хотите.

public class MyNormalizedStringAdapter extends XmlAdapter<String, String> {

    @Override
    public String marshal(String text) {
        return text.trim();
    }

    @Override
    public String unmarshal(String v) throws Exception {
        return v.trim();
    }
}

затем украсьте поле с помощью вашего адаптера следующим образом:

@XmlElement(required=true)
@XmlJavaTypeAdapter(MyNormalizedStringAdapter.class)
String name;
6
11.12.2008 14:27:17
Есть ли другой способ добиться этого без создания специального XmlAdapter?
tkokoszka 13.12.2008 18:54:35
Может ли быть так, что NormalizedStringAdapter полностью поврежден? Он говорит, что удаляет начальные и конечные пробелы (см. Javadoc), но на самом деле это не так!
Kutzi 10.12.2010 13:52:29
@Kutzi Да, либо документация, либо реализация неверна. Все, что он делает - это заменяет символы табуляции, lf и cr пробелом.
kapex 22.04.2013 12:47:51
Нормализация не устраняет пробел, а только «нормализует» его, поэтому комментарий @kapep описывает «правильное» поведение, то есть несколько последовательных «пробельных» символов «нормализуются» в один пробел.
escape-llc 26.10.2015 16:35:47

Чтобы удалить начальные и конечные пробелы во время демаршаллинга, используйте адаптер CollapsedStringAdapter (начиная с Java 1.6).

Встроенный XmlAdapter для обработки xs: token и его производных типов. Этот адаптер удаляет начальные и конечные пробелы, а затем усекает любую последовательность табуляции, CR, LF и SP одним символом пробела ''.

@XmlElement(required=true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
String name;
0
21.02.2020 11:17:00