users@jersey.java.net

Re: [Jersey] Re: ExceptionMapper not handling Exception subclasses

From: Gregg Carrier <greggcarrier_at_gmail.com>
Date: Tue, 29 Jun 2010 09:30:02 -0700

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