Как предотвратить JAXB, избегая строки

У меня есть объект, созданный XJC, называемый Product. Я хочу установить product.currentPrice (a String) как £210, где £ - символ валюты (переданный из другого места в системе).

Проблема заключается в том, что JAXB ускользает от моего амперсанда, поэтому он производит £210. Как сделать это не так?

Ответы

Ответ 1

По умолчанию реализация Marshaller JAXB обычно ускользает от символов. Чтобы изменить это поведение по умолчанию, вам придется написать класс, который реализует интерфейс com.sun.xml.bind.marshaller.CharacterEscapeHandler.

установите этот обработчик в Marshaller

CharacterEscapeHandler escapeHandler = NoEscapeHandler.theInstance;
marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", escapeHandler); 

Вы можете взглянуть на образцы, предоставленные с помощью JAXB, образец escape-кода символа

Ответ 2

Как и rjsang, есть ошибка при использовании кодировки "UTF-8", которая по умолчанию. Если вы не заботитесь о проблемах, связанных с регистром, попробуйте использовать "utf-8" и попросите свой пользовательский escaper работать так, как он должен делать. Также работает UTF-16, ничего, кроме "UTF-8": "uTf-8" и т.д.

Ужасная ошибка в стандарте.

Вот код для этого:

marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "utf-8");

Ответ 3

Если вы реализуете этот интерфейс: com.sun.xml.bind.marshaller.CharacterEscapeHandler, с экранированием собственного символа, но вы хотите делегировать какое-либо поведение традиционному экранированию, вы можете использовать любой из этих кланов (или написать свой собственный код на их основе):

  • com.sun.xml.bind.marshaller.MinimumEscapeHandler
  • com.sun.xml.bind.marshaller.NioEscapeHandler
  • com.sun.xml.bind.marshaller.DumbEscapeHandler

Они поставляются с реализацией JAXB RI AKA jaxb-impl-2.2.1.jar.

Надеюсь, что эта помощь кому-нибудь понравится, как будто это помогло мне.

Ответ 4

Решение для XmlStreamWriter

final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);

Отсюда

Ответ 6

В зависимости от того, что вы ищете, вы можете:

  • отключить экранирование символов
  • или используйте строку CDATA, которая может быть добавлена ​​в JAXB только с помощью бит конфигурации