Как предотвратить 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);
Отсюда
Ответ 5
Как использовать секцию CDATA для переноса значения, а затем использовать реализацию JAXB, например EclipseLink MOXy, которая может обрабатывать CDATA?
Для обработки CDATA с помощью MOXy см.
Ответ 6
В зависимости от того, что вы ищете, вы можете:
- отключить экранирование символов
- или используйте строку CDATA, которая может быть добавлена в JAXB только с помощью
бит конфигурации