JAX-RS и EJB обработка исключений - PullRequest
7 голосов
/ 31 июля 2011

У меня проблемы с обработкой исключений в моей службе RESTful:

@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 - это сопоставленное исключение:

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

А вот преобразователь исключений для 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();
    }

}

Теперь для меня важно предоставить как код ответа, так и некоторый текст ответа конечному пользователю.Однако, когда возникает исключение RestException, это приводит к тому, что также генерируется исключение EJBException (с сообщением «EJB выдал неожиданное (не объявленное) исключение ...»), и сервлет возвращает клиенту только код ответа (ине текст ответа, который я установил в RestException).

Это работает безупречно, когда мой ресурс RESTful не является EJB ... есть идеи?Я работаю над этим часами и у меня нет идей.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 01 декабря 2014

Кажется, проблема связана с обработкой исключений EJB.По спецификации любой system exception (то есть - любое исключение RuntimeException, специально не помеченное как исключение приложения), выброшенное изнутри управляемого компонента, будет упаковано в EJBException, а затем, если необходимо, в RemoteException, выданное клиенту.В этой ситуации вы, похоже, находитесь, и во избежание этого вы можете либо:

  • изменить свое RestException на проверенное исключение и обработать его таким образом
  • use @ ApplicationException аннотация на RestException
  • создайте EJBExceptionMapper и извлеките необходимую информацию из (RestfulException) e.getCause()
0 голосов
/ 08 ноября 2011

Подобный случай работает для меня, когда RestException расширяет javax.ws.rs.WebApplicationException

...