2010-07-20 10 views
12

Mam obiekt wygenerowany przez XJC o nazwie Product. Chcę ustawić product.currentPrice (a String) na £210 gdzie symbol waluty (przekazywany z innego miejsca w systemie).Jak zapobiec ucieczce JAXB z ciągu znaków

Problem polega na tym, że JAXB ucieka z mojego ampersandu, więc zamiast tego generuje £210. Jak mogę to zrobić, nie robiąc tego?

+0

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

Odpowiedz

10

Domyślnie implementacja interfejsu JAXB w programie sprzęgającym zwykle wymyka się znakom. Aby zmienić to domyślne zachowanie, musisz napisać klasę, która implementuje interfejs com.sun.xml.bind.marshaller.CharacterEscapeHandler.

zestaw, który handler w naziemnego

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

Można spojrzeć na próbkach dostarczonych z JAXB, charakter ucieczki próbka

+1

Dobra, to świetnie, ale jeśli ja w tym przypadku jestem zmuszony napisać implementację, która omawia sposób ucieczki od każdej postaci. Jak mogę delegować na domyślne zachowanie, jeśli postać nie jest tym, który mnie interesuje? – rjsang

+1

Przyjmuję to jako poprawną odpowiedź, ponieważ POWINNA być poprawną odpowiedzią. Dla każdego, kto czyta to z nadzieją, że ci to pomoże, to nie działa w JAXB 2.2.1 z powodu błędu (https://jaxb.dev.java.net/issues/show_bug.cgi?id=777) – rjsang

+0

Skoro wydaje się, że źródło już uciekło, czy nie powinno się go po prostu unieruchomić przed przejściem do JAXB? – herman

0

W zależności od tego, czego dokładnie szukasz można:

  • wyłączyć charakterem wyjście małpuje
  • lub użyć CDATA ciąg, który obsługiwać można dodać do JAXB tylko z odrobinie konfiguracji
7

Jak rjsang powiedział, że jest to błąd podczas używania „UTF-8” kodowania, który jest domyślnym. Jeśli nie zależy Ci na rozróżnianiu wielkich i małych liter, spróbuj użyć "utf-8" i uruchom swój niestandardowy escaper tak, jak powinien. Działa także UTF-16, wszystko oprócz "UTF-8": "uTf-8" i tak dalej.

Okropny błąd w standardzie.

Oto kod, aby to zrobić:

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

Pomogło mi to i wydaje się, że nie potrzebujemy używać niestandardowych uchwytów ewakuacyjnych – Akceptor

1

W przypadku zastosowania tego interfejsu: com.sun.xml.bind.marshaller.CharacterEscapeHandler z własną postać ucieczki, ale chcesz przekazać pewne zachowanie do tradycyjnego ucieczce, można użyć dowolnej z tych clases (lub napisać własny kod oparte na nich):

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

Pochodzą one z JAXB RI AKA Realizacja JAXB-IMPL-2.2.1.jar.

Mam nadzieję, że ta pomoc dla nikogo, tak jak mi pomogła.

1

rozwiązanie dla XmlStreamWriter

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

From here