Pregunta Cómo evitar que JAXB escape una cadena


Tengo un objeto, generado por XJC, llamado Product. Quiero establecer product.currentPrice (a String) ser £210 dónde £ es el símbolo de moneda (pasado desde otro lugar en el sistema).

El problema es que JAXB está escapando de mi signo, por lo que produce £210 en lugar. ¿Cómo hago para que no haga esto?


12
2017-07-20 10:26


origen


Respuestas:


De forma predeterminada, la implementación de Marshall Marshall de JAXB generalmente se escapa de los caracteres. Para cambiar este comportamiento predeterminado, deberá escribir una clase que implemente el com.sun.xml.bind.marshaller.CharacterEscapeHandler interfaz.

establecer ese controlador en el Marshaller

CharacterEscapeHandler escapeHandler = NoEscapeHandler.theInstance;
marshaller.setProperty("com.sun.xml.bind.characterEscapeHandler", escapeHandler); 

Puede echar un vistazo a las muestras proporcionadas con JAXB, muestra de escape de caracteres


10
2017-07-20 10:49



Como dijo rjsang, hay un error al usar la codificación "UTF-8", que es el valor predeterminado. Si no le importan los problemas sensibles a las mayúsculas y minúsculas, intente utilizar "utf-8" y haga que su escaner personalizado funcione como se supone que debe hacerlo. También funciona UTF-16, cualquier cosa menos "UTF-8": "uTf-8" y así sucesivamente.

Horrible error en el estándar.

Aquí está el código para hacerlo:

marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "utf-8");

7
2017-11-08 17:48



Solución para XmlStreamWriter

final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);

De aquí


2
2017-12-02 21:41



Si implementa esta interfaz: com.sun.xml.bind.marshaller.CharacterEscapeHandler, con su propio personaje de escape, pero desea delegar algún comportamiento al escape tradicional, puede usar cualquiera de estas clases (o escribir su propio código basado en en ellos):

  • com.sun.xml.bind.marshaller.MinimumEscapeHandler
  • com.sun.xml.bind.marshaller.NioEscapeHandler
  • com.sun.xml.bind.marshaller.DumbEscapeHandler

Vienen con la implementación JAXB RI AKA jaxb-impl-2.2.1.jar.

Espero que esta ayuda a cualquier persona, como me ayudó.


1
2018-06-11 23:48



¿Qué le parece usar una sección CDATA para envolver el valor y luego usar una implementación JAXB como EclipseLink MOXy que puede manejar CDATA?

Para manejar CDATA usando MOXy ver:


0
2017-07-20 14:52



Dependiendo de lo que busque exactamente, puede:

  • desactivar el escape del personaje
  • o use una cadena CDATA cuya compatibilidad se puede agregar a JAXB con solo una poco de configuración

0
2017-08-03 22:18