Question

I'm working on REST web-service written with jersey and I'm trying to output some XML with CDATA sections in it. I understand the reference implementation of JAXB doesn't support that, so I've downloaded EclipseLink's MOXy and I'm trying to get the @XmlCDATA annotation to work.

My JAXB mapped bean looks like this

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; }
}

and I have the jaxb.properties file in the com/me/entities along with the class files. The properties file has

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

in it. I'm sure it gets loaded successfully since if I replace the factory class name with some nonsense the app breaks down. Also, explicitly marshaling the file creating the JAXBContext on my own works fine, so the problem seems related to jersey. According to this my setup is fine, but when my jersey resource returns an instance of MyBean

...
@GET @Produces(MediaType.TEXT_XML) 
public MyBean getMyBean() {
    MyBean b = new MyBean();
    b.setDescription("Some blurb plenty of invalid chars like <<< && >>>");

    return b;
 }

what I get back has no CDATA in it, but looks like

<?xml version="1.0" encoding="UTF-8"?>
<info><longdescription>Some blurb plenty of invalid chars like &lt;&lt;&lt; &amp;&amp; >>></longdescription></info>

What am I doing wrong?

Was it helpful?

Solution

Looks like the problem was my application server: I am running this with WebLogic 10.3.5 in development mode, which comes with a lot of common libraries pre-installed that in the default configuration take precedence over those deployed in the webapp WEB-INF/lib folder.

To fix this a weblogic specific application description is needed, just create a weblogic.xml file inside WEB-INF containing the prefer-web-inf-classes option. The file I used is this:

<?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>

I still have no idea which library was the problem though, anyone knows feel free to edit this answer.

OTHER TIPS

Please download Jaxb Extension: This is Eclipselink open source extension for Jaxb. Get jar file: eclipselink.jar copy into Project lib.

http://www.eclipse.org/eclipselink/downloads/
EclipseLink 2.4.1 Installer Zip (37 MB)

And see example at:

http://theopentutorials.com/tutorials/java/jaxb/jaxb-marshalling-and-unmarshalling-cdata-block-using-eclipselink-moxy/

Good look!.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top