2010-07-20 4 views
12

J'ai un objet, généré par XJC, appelé Product. Je veux définir product.currentPrice (a String) comme £210£ est le symbole monétaire (transmis d'ailleurs dans le système).Comment empêcher JAXB d'échapper une chaîne

Problème, JAXB échappe à mon ampersand, donc il produit £210 à la place. Comment puis-je le faire ne pas le faire?

+0

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

Répondre

10

Par défaut, l'implémentation de la classe JAXB échappe généralement aux caractères. Pour modifier ce comportement par défaut, vous devrez écrire une classe qui implémente l'interface com.sun.xml.bind.marshaller.CharacterEscapeHandler.

ensemble que gestionnaire dans le Marshaller

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

Vous pouvez jeter un oeil à des échantillons fournis avec JAXB, caractère échappant échantillon

+1

D'accord, c'est génial, mais si je fais que je suis obligé d'écrire une implémentation qui couvre comment échapper chaque personnage. Comment puis-je déléguer au comportement par défaut si le personnage n'est pas celui qui m'intéresse? – rjsang

+1

J'accepte ceci comme la bonne réponse, parce que ce devrait être la bonne réponse. Pour tous ceux qui lisent ceci en espérant qu'il vous aidera, cela ne fonctionne pas dans JAXB 2.2.1 à cause d'un bug (https://jaxb.dev.java.net/issues/show_bug.cgi?id=777) – rjsang

+0

Puisqu'il semble que la source est déjà échappée, ne devrait-elle pas simplement être dégagée avant de passer à JAXB? – herman

0

Selon ce que vous cherchez exactement, vous pouvez:

  • caractère désactiver Esc singeant
  • ou utiliser la chaîne CDATA qui soutiennent peuvent être ajoutés en JAXB avec juste un peu de configuration
7

Comme rjsang dit, il y a un bug lors de l'utilisation de codage, qui est la valeur par défaut « UTF-8 ». Si vous ne vous souciez pas des problèmes liés à la casse, essayez d'utiliser "utf-8" et faites fonctionner votre escaper personnalisé comme il est censé le faire. Aussi UTF-16 fonctionne, tout sauf "UTF-8": "uTf-8" et ainsi de suite.

Bogue horrible dans la norme.

Voici le code pour le faire:

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

Cela m'a aidé et semble que nous n'avons pas besoin d'utiliser des gestionnaires d'échappement personnalisés – Akceptor

1

Si vous implémentez cette interface: com.sun.xml.bind.marshaller.CharacterEscapeHandler, avec votre propre personnage échapper, mais vous voulez déléguer certains comportements à l'Évasion traditionnelle, vous pouvez utiliser l'une de ces clases (ou écrivez votre propre code basé sur eux):

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

Ils viennent avec la mise en œuvre JAXB RI Alias ​​JAXB-impl-2.2.1.jar.

J'espère que cette aide à tout le monde, comme il m'a aidé.

1

Solution pour

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

From here