Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set JSON provider at RESTEasy on JBoss 7.1.1

How could I set JSON provider for RestEasy at JBoss 7.1.1?

RestEasy documentation says:

RESTEasy allows you to marshall JAXB annotated POJOs to and from JSON. This provider wraps the Jettison JSON library to accomplish this.

But I found that it seems that on JBoss 7.1.1 Resteasy uses Jackson provider because @XmlTransient on my class field was ignored, but @JsonIgnore was processed.

How can I tell to Resteasy to use Jettison instead of Jackson?

On Jboss I found both providers.

like image 609
Vladimir Avatar asked Aug 06 '12 15:08

Vladimir


2 Answers

if you just want to have a different module pulled than the standard, you can provide this in a jboss specific deployment descriptor.

Read https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7 to learn the details, and read https://docs.jboss.org/author/display/AS7/Implicit+module+dependencies+for+deployments to learn what modules JBoss uses by default.

To exchange the two providers, provide a META-INF/jboss-deployment-structure.xml with the following content below.

This switched the provider for me.

Br Alexander.

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.jboss.resteasy.resteasy-jackson-provider" />
    </exclusions>
    <dependencies>
      <module name="org.jboss.resteasy.resteasy-jettison-provider" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>
like image 155
ahus1 Avatar answered Oct 13 '22 01:10

ahus1


As a follow-on to ahus1's answer: if you have a multi-level deployment archive (i.e. a top-level EAR file containing an EJB jar and a war file), you will need to configure the exclusion of org.jboss.resteasy.resteasy-jackson-provider on whichever sub-deployment contains the RESTEasy/JAX-RS components.

In my deployment, for example, my REST endpoints were annotated on top of EJBs in my EJB jar file, while my @ApplicationPath-annotated javax.ws.rs.core.Application subclass which activates RESTEasy was in my war file. I found that the approaches of putting the exclusions solely on the top-level (EAR) deployment (as in ahus1's example) or on the EJB-jar-level deployment were ineffective, but I finally got RESTEasy to use Jettison rather than Jackson by putting the exclusions on all 3 levels (EAR, EJB, Web):

<?xml version="1.0" encoding="UTF-8" ?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jettison-provider" />
        </dependencies>
    </deployment>
    <sub-deployment name="MyApp-ejb.jar">
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jettison-provider" />
        </dependencies>
    </sub-deployment>
    <sub-deployment name="MyApp.war">
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jettison-provider" />
        </dependencies>
    </sub-deployment>
</jboss-deployment-structure>

It's very likely that I only needed the exclusions on the subdeployments, and putting it on the main EAR deployment is superfluous; I didn't try it that way, since for now putting it on all three seems to work perfectly well.

like image 45
sumitsu Avatar answered Oct 13 '22 00:10

sumitsu