Как предотвратить выход JAXB из строки - PullRequest
13 голосов
/ 20 июля 2010

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

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

Ответы [ 6 ]

10 голосов
/ 20 июля 2010

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

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

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

Вы можете посмотреть примеры, предоставленныеJAXB, образец экранирования символов

7 голосов
/ 08 ноября 2011

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

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

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

marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "utf-8");
2 голосов
/ 03 декабря 2015

Решение для XmlStreamWriter

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

Отсюда

1 голос
/ 12 июня 2013

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

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

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

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

0 голосов
/ 04 августа 2011

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

  • отключить экранирование символов
  • или использовать строку CDATA, поддержку которой можно добавить в JAXB с небольшой настройкой
0 голосов
/ 20 июля 2010

Как насчет использования раздела CDATA для переноса значения, а затем использовать реализацию JAXB, такую ​​как EclipseLink MOXy , которая может обрабатывать CDATA?

Для обработки CDATAиспользуя МОКСИ см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...