Как работать с недопустимыми символами в 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)
Как мне обойти это?
В идеале я мог бы просто удалить этих персонажей, так как они не имеют значения для моего вывода...
Спасибо!
Ответы
Ответ 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);
}