Hi Greg,
What version of Jersey are you using?
What you want to do should be possible. There are unit tests in place
testing this functionality.
When you say:
"When I call my resource method, it hangs until the request times
out."
that is odd behavior perhaps something else is going on? any clues in
the server log?
Paul.
On Jun 29, 2010, at 6:30 PM, Gregg Carrier wrote:
> 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
>
>