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:02:18 -0600

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