Thanks Matthew -
Looking at number 4 in your example, it looks like you have an
ExceptionMapper per specific Exception type - ie - there's a mapper for
every subclass of ServiceException rather than one catch-all for
ServiceException. I'm trying to avoid that and the docs lead me to believe
it's possible, but I can't get it working.
Thanks for your detailed example!
Gregg
On Tue, Jun 29, 2010 at 9:13 AM, mathewch <mathewch_at_gmail.com> wrote:
>
> Hi Gregg,
>
> I too have an ExceptionMapping framework for my service implementation. But
> never had to declare the resource method with the *Exception signature. To
> avoid that use the type RuntimeException. Also make sure the providers are
> getting registered. For your reference, I have my exceptions handled in the
> following way:
>
> 1). Base exception class:
> public class ServiceException extends RuntimeException {
>
>    private static final long serialVersionUID = -339330063981442247L;
>    final protected int       responseStatusCode;
>    protected FaultInfo       faultInfo        = null;
>
>    public ServiceException(String message, int responseStatusCode) {
>        super(message);
>        this.responseStatusCode = responseStatusCode;
>    }
>
>    public ServiceException(String message, int responseStatusCode,
> FaultInfo faultInfo) {
>        this(message, responseStatusCode);
>        this.faultInfo = faultInfo;
>    }
>
>    public ServiceException(int responseStatusCode, FaultInfo faultInfo) {
>        this(faultInfo.getReason(), responseStatusCode);
>        this.faultInfo = faultInfo;
>    }
>
>    public int getResponseStatusCode() {
>        return responseStatusCode;
>    }
>
>    public FaultInfo getFaultInfo() {
>        return faultInfo;
>    }
> }
>
> 2). An exception type:
> public class NotFoundException extends ServiceException {
>    private static final long serialVersionUID     = -3357251481427760852L;
>    public static final int   RESPONSE_STATUS_CODE =
> HttpURLConnection.HTTP_NOT_FOUND;
>
>    public NotFoundException(String message) {
>        super(message, RESPONSE_STATUS_CODE);
>    }
>
>    public NotFoundException(String message, FaultInfo faultInfo) {
>        super(message, RESPONSE_STATUS_CODE, faultInfo);
>    }
>
>    public NotFoundException(FaultInfo faultInfo) {
>        super(RESPONSE_STATUS_CODE, faultInfo);
>    }
> }
>
>
> 3). A fault object to hold the full exception details
> /**
>  *
>  *                              A JAXB type representing an exception for a
> service request.
>  *
>  *
>  *
>  *
>  */
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name = "", propOrder = {
>    "errorCode",
>    "reason",
>    "resource",
>    "exception"
> })
> @XmlRootElement(name = "FaultInfo")
> public class FaultInfo
>    implements Serializable
> {
>
>    private final static long serialVersionUID = 1L;
>    @XmlElement(namespace = "..........")
>    protected Integer errorCode;
>    @XmlElement(namespace = "...............")
>    protected String reason;
>    @XmlElement(namespace = "...................")
>    protected String resource;
>    @XmlElement(namespace = "............")
>    protected String exception;
>
>    /**
>     * Gets the value of the errorCode property.
>     *
>     * @return
>     *     possible object is
>     *     {_at_link Integer }
>     *
>     */
>    public Integer getErrorCode() {
>        return errorCode;
>    }
>
>    /**
>     * Sets the value of the errorCode property.
>     *
>     * @param value
>     *     allowed object is
>     *     {_at_link Integer }
>     *
>     */
>    public void setErrorCode(Integer value) {
>        this.errorCode = value;
>    }
>
>    /**
>     * Gets the value of the reason property.
>     *
>     * @return
>     *     possible object is
>     *     {_at_link String }
>     *
>     */
>    public String getReason() {
>        return reason;
>    }
>
>    /**
>     * Sets the value of the reason property.
>     *
>     * @param value
>     *     allowed object is
>     *     {_at_link String }
>     *
>     */
>    public void setReason(String value) {
>        this.reason = value;
>    }
>
>    /**
>     * Gets the value of the resource property.
>     *
>     * @return
>     *     possible object is
>     *     {_at_link String }
>     *
>     */
>    public String getResource() {
>        return resource;
>    }
>
>    /**
>     * Sets the value of the resource property.
>     *
>     * @param value
>     *     allowed object is
>     *     {_at_link String }
>     *
>     */
>    public void setResource(String value) {
>        this.resource = value;
>    }
>
>    /**
>     * Gets the value of the exception property.
>     *
>     * @return
>     *     possible object is
>     *     {_at_link String }
>     *
>     */
>    public String getException() {
>        return exception;
>    }
>
>    /**
>     * Sets the value of the exception property.
>     *
>     * @param value
>     *     allowed object is
>     *     {_at_link String }
>     *
>     */
>    public void setException(String value) {
>        this.exception = value;
>    }
>
> }
>
> 4). The provider for the NotFoundException:
> @Provider
> public class NotFoundExceptionMapper implements
> ExceptionMapper<NotFoundException> {
>
>    public Response toResponse(NotFoundException ex) {
>        return
>
> Response.status(ex.getResponseStatusCode()).entity(ex.getFaultInfo()).type(MediaType.APPLICATION_XML).build();
>    }
> }
>
> 5). The exception is thrown in the service as follows:
> FaultInfo fault = new FaultInfo();
> fault.setErrorCode(ServiceErrorCode.NO_RECORDS_FOUND);
> fault.setReason("Couldn't find any receipts in the search");
> throw new NotFoundException(fault);
>
> This works as expected but don't know it can be solution to your problem.
>
> Thanks,
> Mathew
> --
> View this message in context:
> http://jersey.576304.n2.nabble.com/ExceptionMapper-not-handling-Exception-subclasses-tp5235614p5235654.html
> Sent from the Jersey mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>
>