2011-07-30 15 views
6

mam problemy obsługi wyjątków w moim relaksującego usługi:JAX-RS i obsługi wyjątków EJB

@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 jest odwzorowany wyjątek:

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

A oto odwzorowujący wyjątek dla 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(); 
    } 

} 

Teraz ważne jest, aby podać zarówno kod odpowiedzi, jak i tekst odpowiedzi do końca. ser. Jednak po wygenerowaniu wyjątku RestException powoduje to wyjątek EJBException (z komunikatem "EJB rzucił nieoczekiwany (niezaprzeczony) wyjątek ..."), a serwlet tylko zwraca kod odpowiedzi do klienta (i nie tekst odpowiedzi ustawiony w wyjątku RestException).

Działa to bezbłędnie, gdy mój RESTful zasób nie jest EJB ... żadnych pomysłów? Pracuję nad tym od wielu godzin i nie mam pomysłów.

Dzięki!

+0

mam podobny USECASE, mój EJB rzuca WebApplicationException i to działa. – lili

Odpowiedz

0

Podobny przypadek działa na mnie, gdy RestException rozciąga javax.ws.rs.WebApplicationException

5

Problem wydaje się być związane z EJB Exception Handling. Zgodnie ze specyfikacją dowolny system exception (czyli dowolny wyjątek RuntimeException, który nie został konkretnie oznaczony jako wyjątek aplikacji), który jest generowany z zarządzanego komponentu bean, zostanie spakowany do wyjątku EJBException, a następnie, w razie potrzeby, do wyjątku RemoteException wysyłanego do klienta. Jest to sytuacja wydaje się być, w celu uniknięcia sytuacji, możesz:

  • zmiana Twój RestException do sprawdzonej wyjątku i obsługiwać go jako takiego
  • użycie @ApplicationException adnotacji na RestException
  • tworzyć EJBExceptionMapper i wyodrębnić informacje potrzebne z (RestfulException) e.getCause()
Powiązane problemy