users@jersey.java.net

[Jersey] Re: Intercept 400 response generation when Jersey detects bad xml?

From: Mike Summers <msummers57_at_gmail.com>
Date: Thu, 26 Jan 2012 10:21:03 -0600

Aha, that worked.

Thanks!

On Thu, Jan 26, 2012 at 10:07 AM, Pavel Bucek <pavel.bucek_at_oracle.com>wrote:

> JAXBException is wrapped in WebApplicationException - you would need to
> have something like
>
> public class MalformedXMLException implements ExceptionMapper<*
> WebApplicationExpception*>
>
> please let me know whether that works.
>
> Pavel
>
>
> On 1/26/12 5:02 PM, Mike Summers wrote:
>
> Hi Pavel.
>
> The exception wrapper works if I unmarshal inside the method, something
> like this:
> @Path("GetUserDetails")
> @POST
> public GetUserDetailsResp GetUserDetails(String r) throws JAXBException{
> GetUserDetailsReq request = new JaxbHelper().unsafeUnmarshall(new
> GetUserDetailsReq(), r);
>
> However if I let Jersey unmarshal as part of the method signature the
> wrapper is not invoked, this does not work:
> @Path("GetUserDetails")
> @POST
> @Consumes(MediaType.APPLICATION_XML)
> public GetUserDetailsResp GetUserDetails(GetUserDetailsReq request) {
>
> Is that as expected/by design? My wrapper looks like:
> public class MalformedXMLException implements
> ExceptionMapper<JAXBException> {
> public Response toResponse(JAXBException e) {
>
> I also tried mapping ParamException but it didn't make any difference.
> Jersey 1.3 btw.
>
> Thanks for the feedback-- Mike
>
> On Thu, Jan 26, 2012 at 9:48 AM, Pavel Bucek <pavel.bucek_at_oracle.com>wrote:
>
>> Hello Mike,
>>
>> you should be able to implement ExceptionMapper for
>> WebApplicationException (which is thrown in this case) and construct your
>> response.
>>
>> Regards,
>> Pavel
>>
>>
>> On 1/24/12 8:58 PM, Mike Summers wrote:
>>
>>> I'm writing a test server that needs to emulate a 3rd party RESTful
>>> server, I'm using Jersey to write the test server.
>>>
>>> All of the requests are POST with application/xml payloads so I started
>>> off with:
>>>
>>> @Path("GetUserDetails")
>>> @POST
>>> @Consumes(MediaType.APPLICATION_XML)
>>> public GetUserDetailsResp GetUserDetails(GetUserDetailsReq request)
>>> {
>>> ...
>>> }
>>>
>>> Jersey happily returns 400 when the XML is badly formatted
>>> (GetUserDetailsReq is a JAXB object), which is not what I need. Rather I
>>> need to return 200 and an XML error block.
>>>
>>> I can get around the 400 by unmarshaling in the method and using an
>>> @Provider/ExceptionMapper class, but that's clunky. Is there a declarative
>>> way to specify to Jersey an alternative to returning the 400? Maybe a
>>> variant on @Provider/ExceptionMapper?
>>>
>>> TIA.
>>>
>>
>>
>
>