Как отловить ошибки проверки RESTEasy Bean?

Я разрабатываю простой сервис RESTFul, используя JBoss-7.1 и RESTEasy. У меня есть служба REST, называемая CustomerService, следующим образом:

@Path(value="/customers")
@ValidateRequest
class CustomerService
{
  @Path(value="/{id}")
  @GET
  @Produces(MediaType.APPLICATION_XML)
  public Customer getCustomer(@PathParam("id") @Min(value=1) Integer id) 
  {
    Customer customer = null;
    try {
        customer = dao.getCustomer(id);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return customer;
    }
}

Здесь, когда я нажимаю URL-адрес http://localhost:8080/SomeApp/customers/-1 тогда ограничение @Min не удастся и на экране отобразится трассировка стека.

Есть ли способ поймать эти ошибки проверки, чтобы я мог подготовить ответ xml с правильным сообщением об ошибке и показать пользователю?


person K. Siva Prasad Reddy    schedule 09.05.2012    source источник


Ответы (1)


Вы должны использовать преобразователь исключений. Пример:

@Provider
public class ValidationExceptionMapper implements ExceptionMapper<javax.validation.ConstraintViolationException> {

    public Response toResponse(javax.validation.ConstraintViolationException cex) {
       Error error = new Error();
       error.setMessage("Whatever message you want to send to user. " + cex);
       return Response.entity(error).status(400).build(); //400 - bad request seems to be good choice
    }
}

где ошибка может быть примерно такой:

@XmlRootElement
public class Error{
   private String message;
   //getter and setter for message field
}

Затем вы получите сообщение об ошибке, завернутое в XML.

person Piotr Kochański    schedule 09.05.2012
comment
Это именно то, что я ищу. Большое спасибо. - person K. Siva Prasad Reddy; 10.05.2012
comment
привет Сива, как вы преобразовали осмысленный объект ошибки из cex.getConstraintViolations(), который возвращает Set‹ConstraintViolation‹T›› , как вы здесь определяете общий тип T? - person Rakesh Waghela; 11.07.2013
comment
Это не работает для меня с Wildfly 8.2.0 (HV 5.1.3, RestEasy 3.0.10), ExceptionMapper полностью игнорируется (сопоставитель исключений никогда не вызывается, объект в ответе не того типа, который я параметр, я получаю ProcessingException из-за несоответствия). Другие преобразователи исключений работают безупречно. Как вы думаете, что может быть причиной? - person jpangamarca; 27.10.2015
comment
@jpangamarca: RestEasy 3.0.10 генерирует не ConstraingViolationException, а собственное ResteasyViolationException. Ваш ValidationExceptionMapper должен обрабатывать это исключение. (это должно быть исправлено в RestEasy 3.0.12). См. issues.jboss.org/browse/RESTEASY-1137. - person robotniko; 16.06.2016
comment
Можем ли мы это сделать? Подкласс ConstraintViolationException. Выбросить экземпляр подкласса в зависимости от компонента/ошибки и перехватить исключение в ExceptionMapper? Возможно, иметь уникальный ExceptionMapper для данного подкласса - person KiranCK; 18.10.2016
comment
Это не верно. Пожалуйста, обратитесь к stackoverflow.com/questions/44308101/ выдает исключение ограничения нарушения - person Yuantao; 08.12.2017