У нас был аналогичный прецедент. Нам понадобилось все поля в нашем XML, обернутом в CDATA. Это было требование API, который нам нужно было реализовать, и мы не имели права говорить в API.
Чтобы решить эту проблему, мы создали реализацию @ StaxMan-х внушения, чтобы переопределить XMLOutputFactory и XMLStreamWriter угнать writeCharacters()
и позвонить writeCData()
вместо этого, и это, кажется, отлично работает. Вы можете увидеть суть нашего точного кода (с именами пакетов изменены) здесь:
https://gist.github.com/jbcpollak/8312151
Короче говоря, мы создали CDataXmlOutputFactoryImpl
класс, который создает CDataXmlStreamWriter
. К сожалению, вместо использования наследования нам нужно было обернуть целевые классы, потому что оба они были окончательными. Кроме того, точный писатель для использования является переменным, поэтому упаковка является более безопасным вариантом.
На заводе, в дополнении к оборачивать все другие методы с чистыми функциями сквозных, вам нужно что-то вроде этого для каждой функции createXMLStreamWriter() (есть 4):
public XMLStreamWriter createXMLStreamWriter(Writer w)
throws XMLStreamException
{
return new CDataXmlStreamWriter(f.createXMLStreamWriter(w));
}
где f
- OutputFactoryImpl
, построенный в классе.
В CDataXmlStreamWriter
все необходимые функции чистые делегаты методов в ш, для двух методов ниже, за исключением:
public void writeCharacters(char[] text, int start, int len)
throws XMLStreamException
{
w.writeCharacters(text, start, len);
}
// All this code just to override this method
public void writeCharacters(String text) throws XMLStreamException
{
w.writeCData(text);
}
Вот все, что вам нужно сделать. Просто используйте свою новую фабрику следующим образом:
Полный код можно увидеть в Gist выше.
Я не уверен, что это решение будет работать, если вам понадобится только несколько полей, завернутых в CDATA. Для этого я думаю, вам нужно будет изменить ToXmlGenerator, чтобы каким-то образом узнать о вашей модели (используя аннотации, возможно?), А затем генератор будет звонить writeCData()
там, где это необходимо.
все сложнее, чем я надеялся, но намного чище, чем мой взлом реального физического текста. – AnthonyJClink
Согласен, я хочу, чтобы код Джексона был немного более гибким. Поскольку они обеспечивают возможность переопределять фабричные классы, я не понимаю, почему все соответствующие классы являются окончательными. Было бы еще лучше, если бы CData поддерживался аннотациями. – JBCP