Pracuję nad usługą REST napisaną z jersey i próbuję wyprowadzić trochę XML z sekcjami CDATA. rozumiem referencyjna implementacja JAXB tego nie obsługuje, więc pobrałem MOXy EclipseLink i próbuję uzyskać adnotację @XmlCDATA do działania.
Moja zmapowana fasola JAXB wygląda tak
package com.me.entities;
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD)
public class MyBean {
@XmlAttribute
private URI thumbnail;
@XmlElement(name="longdescription") @XmlCDATA
private String description;
public MyBean() { }
public final String getDescription() { return description; }
public final void setDescription(String d) { this.description = d; }
}
i mam jaxb.properties
plik w com/me/entities
wraz z plikami klas. Plik właściwości ma
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
w tym. Jestem pewien, że zostanie pomyślnie załadowany, ponieważ jeśli zastąpię nazwę klasy fabrycznej jakimś nonsensem, aplikacja się psuje. Ponadto jawne zestawianie pliku tworzącego JAXBContext na moich własnych pracach działa dobrze, więc problem wydaje się być związany z jersey. Według to moja konfiguracja jest w porządku, ale kiedy mój zasób Jersey zwraca instancję MyBean
...
@GET @Produces(MediaType.TEXT_XML)
public MyBean getMyBean() {
MyBean b = new MyBean();
b.setDescription("Some blurb plenty of invalid chars like <<< && >>>");
return b;
}
to, co otrzymam, nie ma w sobie CDATA, ale wygląda
<?xml version="1.0" encoding="utf-8"?>
<info><longdescription>Some blurb plenty of invalid chars like <<< && >>></longdescription></info>
Co ja robię źle?
Odpowiedzi:
2 dla odpowiedzi № 1Wygląda na to, że problemem był mój serwer aplikacji: korzystam z niego WebLogic 10.3.5 w trybie programowania, który zawiera wiele wstępnie zainstalowanych bibliotek wspólnych, które w domyślnej konfiguracji mają pierwszeństwo przed bibliotekami wdrażanymi w aplikacji internetowej WEB-INF/lib
teczka.
Aby to naprawić, potrzebny jest opis aplikacji specyficzny dla weblogu, wystarczy utworzyć plik weblogic.xml
plik wewnątrz WEB-INF
zawierające prefer-web-inf-classes
opcja. Plik, którego użyłem, to:
<?xml version="1.0" standalone="yes"?>
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
Nadal nie mam pojęcia, która biblioteka była problemem, każdy wie, że możesz edytować tę odpowiedź.
0 dla odpowiedzi nr 2
Pobierz Jaxb Extension: Jest to rozszerzenie open source Eclipselink dla Jaxb. Pobierz plik jar: kopię eclipselink.jar do biblioteki lib projektu.
http://www.eclipse.org/eclipselink/downloads/
EclipseLink 2.4.1 Installer Zip (37 MB)
I patrz przykład na:
Dobry wygląd!.