users@jersey.java.net

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

From: Pavel Bucek <pavel.bucek_at_oracle.com>
Date: Thu, 26 Jan 2012 17:07:23 +0100

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