Как бороться с недопустимыми символами в выводе WS при использовании CXF? - PullRequest
18 голосов
/ 15 марта 2012

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

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

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)

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

Ответы [ 4 ]

16 голосов
/ 13 ноября 2012
/**
* 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

8 голосов
/ 18 марта 2012

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

Вот класс, который выдает исключение: 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» на конечной точке / шине в значение true, чтобы отключить прямую запись в выходной поток и всегда проходите через XMLStreamWriter. Должен выполнить то же самое без накладных расходов на создание SAAJModel.

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

1 голос
/ 24 ноября 2017

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

Вы можете найти более подробную информацию здесь .

НТН!

0 голосов
/ 15 октября 2014

Ответ с самым высоким рейтингом у меня не сработал, так как данная кодировка 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...