2010-07-20 11 views
12

Ho un oggetto, generato da XJC, chiamato Product. Voglio impostare product.currentPrice (a String) per essere £210 dove £ è il simbolo di valuta (passato da altrove nel sistema).Come impedire a JAXB di eseguire il escape di una stringa

Il problema è che JAXB sta evadendo la mia e commerciale, quindi produce £210. Come faccio a non farlo?

+0

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

risposta

10

Per impostazione predefinita, l'implementazione del marshaller di JAXB di solito sfugge ai caratteri. Per modificare questo comportamento predefinito, dovrai scrivere una classe che implementa l'interfaccia com.sun.xml.bind.marshaller.CharacterEscapeHandler.

set che gestore del Marshaller

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

È possibile dare un'occhiata a campioni forniti con JAXB, carattere fuga campione

+1

Ok, è grandioso, ma se io Fallo, sono costretto a scrivere un'implementazione che copra come sfuggire a ogni singolo personaggio. Come delegare al comportamento predefinito se il personaggio non è quello a cui sono interessato? – rjsang

+1

Accetto questo come risposta corretta, perché DOVREBBE essere la risposta corretta. Per chiunque altro leggendo questo spero che ti aiuti, questo in realtà non funziona in JAXB 2.2.1 a causa di un bug (https://jaxb.dev.java.net/issues/show_bug.cgi?id=777) – rjsang

+0

Dal momento che sembra che la fonte sia già sfuggita, non dovrebbe semplicemente essere senza caratteri di escape prima di passare a JAXB? – herman

0

A seconda di ciò che si sta esattamente cercando è possibile:

  • carattere disable Esc imitando
  • oppure utilizzare stringa CDATA che supporto può essere aggiunta in JAXB con solo un bit di configurazione
7

Come rjsang detto, c'è un errore durante l'uso codifica "UTF-8", che è il default. Se non ti preoccupi dei problemi relativi alla distinzione tra maiuscole e minuscole, prova a utilizzare "utf-8" e fai in modo che l'escaper personalizzato funzioni come dovrebbe. Anche UTF-16 funziona, tranne "UTF-8": "uTf-8" e così via.

Insetto terribile nello standard.

Ecco il codice per farlo:

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

Questo mi ha aiutato e sembra che non abbiamo bisogno di usare gestori di escape personalizzati – Akceptor

1

Se si implementa questa interfaccia: com.sun.xml.bind.marshaller.CharacterEscapeHandler, con il proprio personaggio in fuga, ma si desidera delegare alcuni comportamenti alla fuga tradizionale, è possibile utilizzare una qualsiasi di queste Clases (o scrivere il proprio codice basata su di essi):

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

Vengono con la JAXB RI attuazione AKA jaxb-impl-2.2.1.jar.

Spero che questo aiuto a chiunque, come mi ha aiutato.

1

Soluzione per XmlStreamWriter

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

From here

Problemi correlati