Я немного поиграл с вашим примером и отлаживал код JAXB. И похоже, что-то конкретное в используемой кодировке UTF-8. Свойство escapeHandler MarshallerImpl
, похоже, установлено правильно. Однако это используется не в каждом контексте. Если я искал звонки MarshallerImpl.createEscapeHandler()
, я нашел:
public XmlOutput createWriter( OutputStream os, String encoding ) throws JAXBException {
// UTF8XmlOutput does buffering on its own, and
// otherwise createWriter(Writer) inserts a buffering,
// so no point in doing a buffering here.
if(encoding.equals("UTF-8")) {
Encoded[] table = context.getUTF8NameTable();
final UTF8XmlOutput out;
if(isFormattedOutput())
out = new IndentingUTF8XmlOutput(os,indent,table);
else {
if(c14nSupport)
out = new C14nXmlOutput(os,table,context.c14nSupport);
else
out = new UTF8XmlOutput(os,table);
}
if(header!=null)
out.setHeader(header);
return out;
}
try {
return createWriter(
new OutputStreamWriter(os,getJavaEncoding(encoding)),
encoding );
} catch( UnsupportedEncodingException e ) {
throw new MarshalException(
Messages.UNSUPPORTED_ENCODING.format(encoding),
e );
}
}
Обратите внимание, что в вашей настройке учтен верхний раздел (...equals("UTF-8")...)
. Однако этот не берет escapeHandler
. Однако, если вы установите кодировку на любое другое, нижняя часть этого метода называется (createWriter(OutputStream, String)
), и этот использует escapeHandler
, поэтому EH играет свою роль.
Итак, добавив ...
marshaller.setProperty(Marshaller.JAXB_ENCODING, "ASCII");
позволяет вызывать ваш пользовательский CharacterEscapeHandler
.
Не совсем уверен, но я думаю, это ошибка в JAXB.