users@jersey.java.net

[Jersey] Re: How does jersey runtime get its JAXBContext

From: Farrukh Najmi <farrukh_at_wellfleetsoftware.com>
Date: Wed, 15 Feb 2012 16:22:17 -0500

Hi Glen,

Thanks for the pointer. I checked and believe that my REST app is quite
consistent with json-from-jaxb sample.
The problem seems to be that my ContextResolver<JAXBContext> impl class'
getContext() method is not being called when creating the Marshaller for
the REST request.
During startup of my server I see that my ContextResolver<JAXBContext>
impl class' constructor is called not once but twice with similar stack
trace.

Since my ContextResolver<JAXBContext> impl class includes the package
"net.opengis.gml.v_3_1_1" in its context path it sure seems like if its
getContext() method was called during the creation of the Marshaller
then all would be well.

Debugging the code it appears that
com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider method "protected
final Marshaller getMarshaller(Class type, MediaType mt) throws
JAXBException" never uses the ContextResolver because fixedMediaType
member is true. Why is my ContextResolver not being called? I am not
sure if the problem is in my code or jersey runtime code.

Any further advice on how to debug this further? Thanks very much.

On 02/15/2012 03:51 PM, Glen Mazza wrote:
> Have you looked at the Jersey json-from-jaxb sample? I believe it
> uses a JAXBContext to provide both XML and JSON options, see the
> bottom of the file here:
> http://java.net/projects/jersey/sources/svn/content/trunk/jersey/samples/json-from-jaxb/README.html?rev=5653
>
> It might point out something that can fix your problem.
>
> Regards,
> Glen
>
> On 02/15/2012 03:26 PM, Farrukh Najmi wrote:
>>
>> Hi Guys,
>>
>> I am still stuck on the problem posted earlier in this thread under a
>> different subject.
>>
>> In order for me to get this resolved I am thinking I need a clearer
>> understanding of how jersey creates its JAXBContext that it uses to
>> marshal and unmarshal JAXB objects.
>> In particular I am curious how I can give the jersey runtime a
>> JAXBContext that I have alredayt created elsewhere.
>>
>> I would be grateful if someone could provide some guidance. Thanks.
>>
>> On 02/10/2012 02:59 PM, Farrukh Najmi wrote:
>>> Hi Guys,
>>>
>>> Upon further investigation here are some findings on my problem....
>>>
>>> * First the class in question
>>> net.opengis.gml.v_3_1_1.PolygonType is definitely in a jar in
>>> my classpath for the web app
>>> * The "JAXBException: <Class> is not known to this context"
>>> problem seems to be experienced due to ClassLoader issues in
>>> many cases:
>>> o https://issues.apache.org/jira/browse/GERONIMO-3793
>>> o http://mail-archives.apache.org/mod_mbox/cxf-users/200809.mbox/%3C1220547389.13894.37.camel@ubuntu%3E
>>> o http://healthvaultjavalib.codeplex.com/workitem/10842
>>> * I do not experience this problem when I use the SOAP endpoint
>>> to the same webapp but only when I use the jersey REST endpoint
>>> * In my own code I am not doing any ClassLoader magic that I
>>> know off
>>> * I am using spring-framework in case it is relevant
>>>
>>> Any idea what else I can try to get to the bottom of this? Is this
>>> issue more appropriate for the users_at_jaxb list?
>>>
>>>
>>> On 02/09/2012 12:53 PM, Farrukh Najmi wrote:
>>>>
>>>> I am getting the following exception in my jersey endpoint built
>>>> using jersey 1.10:
>>>>
>>>> javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
>>>> - with linked exception:
>>>> [javax.xml.bind.JAXBException: net.opengis.gml.v_3_1_1.PolygonType
>>>> is not known to this context]
>>>> at
>>>> com.sun.jersey.core.provider.jaxb.AbstractJAXBElementProvider.writeTo(AbstractJAXBElementProvider.java:141)
>>>> at
>>>> com.sun.jersey.core.provider.jaxb.AbstractJAXBElementProvider.writeTo(AbstractJAXBElementProvider.java:79)
>>>> at
>>>> com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
>>>> at
>>>> com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1437)
>>>> at
>>>> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
>>>> at
>>>> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
>>>> at
>>>> com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
>>>> at
>>>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
>>>> at
>>>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
>>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
>>>>
>>>>
>>>> This happens when the endpoint returns an XML response using a
>>>> JAXBElement. The element look like this (simplified):
>>>>
>>>> <RegistryObject xsi:type="ExtrinsicObjectType"
>>>> xmlns:ns2="http://www.w3.org/1999/xlink"
>>>> <http://www.w3.org/1999/xlink>
>>>> xmlns="urn:oasis:names:tc:ebxml-regrep:xsd:rim:4.0"
>>>> xmlns:ns4="urn:oasis:names:tc:ebxml-regrep:xsd:rs:4.0"
>>>> xmlns:ns3="http://www.w3.org/2005/08/addressing"
>>>> <http://www.w3.org/2005/08/addressing>
>>>> xmlns:ns5="urn:oasis:names:tc:ebxml-regrep:xsd:spi:4.0"
>>>> xmlns:ns6="urn:oasis:names:tc:ebxml-regrep:xsd:query:4.0"
>>>> xmlns:ns7="urn:oasis:names:tc:ebxml-regrep:xsd:lcm:4.0"
>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>> <http://www.w3.org/2001/XMLSchema-instance>>
>>>> <Slot name="urn:iso:TC211:19115:slot:geographicBoundingBox"
>>>> type="urn:ogc:def:dataType:ISO-19107:GM_Envelope">
>>>> <SlotValue xsi:type="AnyValueType">
>>>> <ns8:Polygon srsName="urn:ogc:def:crs:EPSG::4326"
>>>> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>>>> <http://schemas.xmlsoap.org/soap/envelope/>
>>>> xmlns:ns9="http://www.w3.org/2001/SMIL20/"
>>>> <http://www.w3.org/2001/SMIL20/>
>>>> xmlns:ns10="http://www.w3.org/2001/SMIL20/Language"
>>>> <http://www.w3.org/2001/SMIL20/Language>
>>>> xmlns:ns8="http://www.opengis.net/gml" <http://www.opengis.net/gml>>
>>>> <ns8:exterior>
>>>> <ns8:LinearRing>
>>>> <ns8:pos>-120.0 25.0</ns8:pos>
>>>> <ns8:pos>-70.0 25.0</ns8:pos>
>>>> <ns8:pos>-70.0 40.0</ns8:pos>
>>>> <ns8:pos>-120.0 40.0</ns8:pos>
>>>> <ns8:pos>-120.0 25.0</ns8:pos>
>>>> </ns8:LinearRing>
>>>> </ns8:exterior>
>>>> </ns8:Polygon>
>>>> </SlotValue>
>>>> </Slot>
>>>> </RegistryObject>
>>>>
>>>> The XML Schema for above is defined here
>>>> <http://docs.oasis-open.org/regrep/regrep-core/v4.0/cos01/xsd/rim.xsd>.
>>>>
>>>> The <SlotValue xsi:type="AnyValueType"> element allows xs:anyType.
>>>>
>>>> I have a ContextResolver as part of the jersey endpoint that has a
>>>> JAXBContext that includes JAXB bindings for the ns8:Polygon element
>>>> and the classpath contai9ns the jar containing the
>>>> net.opengis.gml.v_3_1_1.PolygonType class.
>>>>
>>>> During debug it seems that my ContextResolver is never called
>>>> because
>>>> com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider#getMarshaller (line
>>>> 140 in jersey 1.10)
>>>> skips the resolver because fixedMediaType is true.
>>>>
>>>> I would be very grateful for any suggestions on how to debug this
>>>> more and get past this problem.


-- 
Regards,
Farrukh Najmi
Web: http://www.wellfleetsoftware.com