2011-07-30 10 views
6

estoy teniendo problemas para manejar excepciones en mi servicio REST excepción de EJB:JAX-RS y gastos de

@Path("/blah") 
@Stateless 
public class BlahResource { 
    @EJB BlahService blahService; 

    @GET 
    public Response getBlah() { 
     try { 
      Blah blah = blahService.getBlah(); 
      SomeUtil.doSomething(); 
      return blah; 
     } catch (Exception e) { 
      throw new RestException(e.getMessage(), "unknown reason", Response.Status.INTERNAL_SERVER_ERROR); 
     } 
    } 
} 

RestException es una excepción asignada:

public class RestException extends RuntimeException { 
    private static final long serialVersionUID = 1L; 
    private String reason; 
    private Status status; 

    public RestException(String message, String reason, Status status) { 
     super(message); 
     this.reason = reason; 
     this.status = status; 
    } 
} 

Y aquí es el asignador de excepción para RestException :

@Provider 
public class RestExceptionMapper implements ExceptionMapper<RestException> { 

    public Response toResponse(RestException e) { 
     return Response.status(e.getStatus()) 
      .entity(getExceptionString(e.getMessage(), e.getReason())) 
      .type("application/json") 
      .build(); 
    } 

    public String getExceptionString(String message, String reason) { 
     JSONObject json = new JSONObject(); 
     try { 
      json.put("error", message); 
      json.put("reason", reason); 
     } catch (JSONException je) {} 
     return json.toString(); 
    } 

} 

Ahora, es importante para mí proporcionar un código de respuesta Y un texto de respuesta al final u ser. Sin embargo, cuando se lanza una RestException, esto provoca una EJBException (con el mensaje "EJB arrojó una excepción inesperada (no declarada) ...") para ser lanzada también, y el servlet solo devuelve el código de respuesta al cliente (y no el texto de respuesta que establecí en RestException).

Esto funciona sin problemas cuando mi recurso RESTful no es un EJB ... alguna idea? He estado trabajando en esto durante horas y me he quedado sin ideas.

Gracias!

+0

Tengo un uso similar, mi EJB arroja WebApplicationException y funciona. – lili

Respuesta

0

Un caso similar funciona para mí cuando RestException extiende javax.ws.rs.WebApplicationException

5

El problema parece estar relacionado con el manejo de excepciones EJB. Según la especificación, cualquier system exception (es decir, cualquier RuntimeException no marcada específicamente como Excepción de aplicación) que se lanza desde un bean administrado se empaqueta en una EJBException y luego, si es necesario, en RemoteException arrojada al cliente. Esa es una situación que parece estar en, y con el fin de evitar que pueda ya sea:

  • cambio de su RestException en una excepción comprobada y manejarlo como tal
  • uso @ApplicationException anotación en su RestException
  • crear EJBExceptionMapper y extraer la información necesaria de (RestfulException) e.getCause()
Cuestiones relacionadas