On Feb 27, 2009, at 7:16 PM, Chris Jolley wrote:
> I have an @QueryParam Object and am parsing the request param in
> the constructor of my object.
>
> Example:
>
> @Produces({"application/json", "application/xml"})
> public Lists getJsonOrXml(
> @DefaultValue(DEFAULT_VIEW)
> @QueryParam(VIEW_PARAM) ViewParam view)
>
> If the value for my param is malformed I throw a BadRequestException
> and I have an ExceptionMapper set up to capture that exception and
> return a 400. However, the ExceptionMapper never gets invoked. The
> container sends back a 404 instead.
>
> Is this by design? Is there a way to change this behavior?
>
>
The spec states in 3.2 [1]:
A WebApplicationException thrown during construction of field or
property values using 2 or 3 above is
processed directly as described in section 3.3.4. Other exceptions
thrown during construction of field or property
values using 2 or 3 above are treated as client errors: if the
field or property is annotated with @MatrixParam,
@QueryParam or @PathParam then an implementation MUST generate a
WebApplicationException that wraps
the thrown exception with a not found response (404 status) and no
entity; if the field or property is annotated
with @HeaderParam or @CookieParam then an implementation MUST
generate a WebApplicationException
that wraps the thrown exception with a client error response (400
status) and no entity. The
WebApplicationException MUST be then be processed as described in
section 3.3.4.
So you need to utilize WebApplicationException or a define sub-class
of for such cases if you want to override the default. You can use an
exception mapper for a sub-class of WebApplicationException to
specifically map instances of the sub-class.
The thoughts behind this were that we did not want any exception
"leaking" out so that it might be mapped to some other incorrect
status code.
Paul.
[1]
https://jsr311.dev.java.net/nonav/releases/1.0/spec/
spec3.html#x3-220003.2