2010-07-20 28 views
12

Tengo un objeto, generado por XJC, llamado Product. Quiero configurar product.currentPrice (a String) para que sea £210 donde £ es el símbolo de moneda (que se pasa desde otro lugar del sistema).Cómo evitar que JAXB escape una cadena

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

+0

posible duplicado? http://stackoverflow.com/questions/1506663/can-i-force-jaxb-not-to-convert-into-quot-for-example-when-marshalling-to-x –

Respuesta

10

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

conjunto que manejador en el Marshaller

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

Usted puede echar un vistazo a las muestras proporcionadas con JAXB, carácter escapar de la muestra

+1

De acuerdo, eso es genial, pero si hacer eso me veo obligado a escribir una implementación que cubra cómo escapar de cada personaje. ¿Cómo delego el comportamiento predeterminado si el personaje no es el que me interesa? – rjsang

+1

Estoy aceptando esta como la respuesta correcta, porque DEBERÍA ser la respuesta correcta. Para cualquier otra persona que lea esto esperando que lo ayude, esto en realidad no funciona en JAXB 2.2.1 debido a un error (https://jaxb.dev.java.net/issues/show_bug.cgi?id=777) – rjsang

+0

Dado que parece que la fuente ya se ha escapado, ¿no debería simplemente descamarse antes de pasar a JAXB? – herman

0

Dependiendo de lo que está buscando exactamente para usted puede:

  • carácter desactivar Esc imitando
  • o utilizar cadena CDATA que soporte puede ser añadido en JAXB con sólo un poco de configuración
7

Como rjsang dijo, hay un error cuando se utiliza "UTF-8" encoding, 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.

Este es el código para hacerlo:

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

Esto me ayudó y parece que no necesitamos usar manejadores de escape personalizados – Akceptor

1

Si decide implementar esta interfaz: com.sun.xml.bind.marshaller.CharacterEscapeHandler, con su propio carácter escapar, pero que desea delegar alguna conducta Escapar a la tradicional, se puede utilizar cualquiera de estas clases (o escribir su propio código en base a ellos):

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

Ellos vienen con el JAXB RI También conocido como Implementación jaxb-impl-2.2.1.jar.

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

1

Solución para XmlStreamWriter

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

From here

Cuestiones relacionadas