Who doesn't remember the awesome
"Sorry Miss Jackson" video ?
Actually that doesn't have to do anything with what I am talking here -- except that RestEasy inside JBossAS7 is internally using the
Jackson json processing library. But let me start from the beginning.
Inside the RHQ REST api we have exposed links (in json representation) like this:
{
"rel":"self",
"href":"http://...
}
which is the natural format when a Pojo
class Link {
String rel;
String href;
}
is serialized (with the Jackson provider in RestEasy).
Now while this is pretty cool, there is the disadvantage that if you need the link for a
rel
of 'edit', you had to load the list of links, iterate over them and check for each link if its
rel
is 'edit' and then take the value of the
href
.
And there is this
Bugzilla entry.
I started investigating this and thought, I will use a
MessageBodyWriter
and all is well. Unfortunately
MessageBodyWriter
s do not work recursively and thus cannot format Link objects as part of another object in a special way.
Luckily I have done custom serialization with Jackson in the as7-plugin before, so I tried this, but the Serializer was not even instantiated. More trying and fiddling and a
question on StackOverflow led me to a solution by copying the jackson libraries (core, mapper and jaxrs) into the lib directory of the RHQ ear and then all of a sudden the new serialization worked. The output is now
{ "self":
{ "href" : "http://..." }
}
So far so nice.
Now the final riddle was how to use the jackson libraries that are already in user by the resteasy-jackson-provider. And this was solved by adding respective entries to
jboss-deployment-structure.xml
, which ends up in the
META-INF
directory of the
rhq.ear
directory.
The content in this
jboss-deployment-structure.xml
then looks like this (abbreviated):
<sub-deployment name="rhq-enterprise-server-ejb3.jar">
<dependencies>
....
<module name="org.codehaus.jackson.jackson-core-asl" export="true"/>
<module name="org.codehaus.jackson.jackson-jaxrs" export="true"/>
<module name="org.codehaus.jackson.jackson-mapper-asl" export="true"/>
</dependencies>
</sub-deployment>
AS7 is still complaining a bit at startup:
16:48:58,375 WARN [org.jboss.as.dependency.private] (MSC service thread 1-3) JBAS018567: Deployment "deployment.rhq.ear.rhq-enterprise-server-ejb3.jar" is using a private module ("org.codehaus.jackson.jackson-core-asl:main") which may be changed or removed in future versions without notice.
but for the moment the result is good enough - and as we do not regularly change the underlying container for RHQ, this is tolerable.
And of course I would be interested in an "official" solution to that -- other than just doubling those jars into my application (and actually I think this may even complicate the situation, as (re-)using the jackson jars that RestEasy inside as7 uses, guarantees that the version is compatible).