Выход из кавычек с использованием jackson-dataformat-xml - PullRequest
2 голосов
/ 28 июня 2019

Мне нужна помощь с jackson-dataformat-xml. Мне нужно сериализовать List<String> с использованием XmlMapper в XML с кодировкой кавычек "&quot;.

Но после сериализации XmlMapper кодирует все другие специальные символы (<, >, & и т. Д.), Но игнорирует кавычки (' и ") вообще ... Если я кодирую строку вручную перед сериализацией содержимое портится, потому что &quot; содержит '&' внутри и сериализуется как &amp;quot; вместо, конечно.

Может, кто-нибудь знает, как заставить это работать? Кроме того, есть ли способ в качестве обходного пути отключить автоматическое кодирование специальных символов в поле List<String> с помощью @JacksonRawValue или что-то в этом роде? Эта аннотация прекрасно работает с простыми (не массивами) полями, но не работает должным образом на List<String>.

Спасибо.

1 Ответ

2 голосов
/ 28 июня 2019

Вот как проблема была решена.Я использовал расширение Woodbox Stax2.Это очень помогло.https://github.com/FasterXML/jackson-dataformat-xml/issues/75

XmlMapper xmlMapper = new XmlMapper(module);
xmlMapper.getFactory().getXMLOutputFactory().setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, 
new CustomXmlEscapingWriterFactory());

А вот и фабрика.

public class CustomXmlEscapingWriterFactory implements EscapingWriterFactory {
public Writer createEscapingWriterFor(final Writer out, String enc) {
    return new Writer(){
        @Override
        public void write(char[] cbuf, int off, int len) throws IOException {
            String val = "";
            for (int i = off; i < len; i++) {
                val += cbuf[i];
            }
            String escapedStr =  StringEscapeUtils.escapeXml(val);
            out.write(escapedStr);
        }

        @Override
        public void flush() throws IOException {
            out.flush();
        }

        @Override
        public void close() throws IOException {
            out.close();
        }
      };
    }

    public Writer createEscapingWriterFor(OutputStream out, String enc) {
        throw new IllegalArgumentException("not supported");
    }
}
...