Подтвердить что ты не робот

Как работать с недопустимыми символами в WS-выходе при использовании CXF?

Я использую Spring, CXF и Hibernate для создания WebService, которые выполняют поисковые запросы в чужой базе данных, у которых есть доступ только для чтения.

Проблема в том, что некоторые записи в базе данных имеют странные символы (0x2) в текстовых полях, и кажется, что CXF или библиотека (Aegis?), которую он использует для обработки/сериализации объектов, возвращаемых с сеанса Hibernate, t справиться с этим:

org.apache.cxf.aegis.DatabindingException: Error writing document.. Nested exception is com.ctc.wstx.exc.WstxIOException: Invalid white space character (0x2) in text to output (in xml 1.1, could output as a character entity)

Как мне обойти это? В идеале я мог бы просто удалить этих персонажей, так как они не имеют значения для моего вывода... Спасибо!

4b9b3361

Ответ 1

/**
* From xml spec valid chars:<br>
* #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]<br>
* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.<br>
* @param text The String to clean
* @param replacement The string to be substituted for each match
* @return The resulting String
*/
public static String CleanInvalidXmlChars(String text, String replacement) {
    String re = "[^\u0009\r\n\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF]";
    return text.replaceAll(re, replacement);
}

источник: http://www.theplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-characterheplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-character

Ответ 2

Я не уверен, что это отвечает на ваш вопрос, но вот что я нашел.

Вот класс, который генерирует исключение: http://svn.codehaus.org/woodstox/wstx/trunk/src/java/com/ctc/wstx/api/InvalidCharHandler.java

Похоже, здесь есть обсуждение этой проблемы: http://comments.gmane.org/gmane.comp.apache.cxf.user/4373

Возможно, это может вам помочь: Вы также можете установить свойство disable.outputstream.optimization на endpoint/bus - true, чтобы отключить прямую запись в выходной поток и всегда просматривайте XMLStreamWriter. Должно совершить то же самое без накладных расходов на создание SAAJModel.

Надеюсь, это немного поможет.

Ответ 3

Чтобы добиться желаемого поведения и избежать исключений, вам придется расширять Windows Woodstoks factory com.ctc.wstx.stax.WstxOutputFactory своими собственными, которые должны только перезаписать свойство com.ctc.wstx.outputInvalidCharHandler экземпляром com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler, Этот обработчик принимает в качестве аргумента конструктора замену char на недопустимые. Создав свой экземпляр, создайте файл с именем META-INF/services/javax.xml.stream.XMLOutputFactory и поместите внутри него только полное имя вашей реализации (убедитесь, что оно будет помещено в каталог META-INF/services в полученной банке).

Подробнее здесь.

НТН!

Ответ 4

Самый верный ответ не работал у меня, поскольку данная кодировка Unicode была отклонена. Однако с небольшими изменениями оно показало желаемое поведение:

public static String CleanInvalidXmlChars(String text, String replacement) {
    String re = "[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\\u0001\\u0000-\\u0010\\uFFFF]";
    return text.replaceAll(re, replacement);
}