Захват текста сообщения Hibernate Validator в Spring MVC - PullRequest
1 голос
/ 19 марта 2012

Я работаю над REST API, используя Spring-MVC и json. Я запускаю свои автоматические тесты, используя Jetty и базу данных в памяти. Я хочу проверить, что публикация неверного объекта домена выдает сообщение об ошибке из аннотации @NotEmpty. Но все, что я получаю, - это страница с ошибкой Jetty 400 по умолчанию.

У меня есть класс домена с некоторой проверкой:

@Entity
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty(message = "Name is a required field")
    private String name;

    /* getters, setters */
}

Вот контроллер

@Controller
public class CompanyController {
    @RequestMapping(value = "/company", 
        method = RequestMethod.POST, 
        consumes = "application/json")
    public void createCompany(
        @Valid @RequestBody final Company company,
        final HttpServletResponse response) {

        //persist company
        response.setStatus(HttpServletResponse.SC_CREATED);
        response.setHeader("location", "/company/" + company.getId());
    }
}

Как я могу получить значение "Name is a required field", возвращаемое как часть ответа?

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Это делает это:

@ExceptionHandler(value = MethodArgumentNotValidException.class)
public void exceptionHandler(final MethodArgumentNotValidException ex, 
                     final HttpServletResponse response) throws IOException {

    for (final ObjectError objectError : ex.getBindingResult().getAllErrors()) {
        response.getWriter().append(objectError.getDefaultMessage()).append(".");
    }
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
0 голосов
/ 13 мая 2014

вариант Spring 3.2 с использованием ControllerAdvice и ResponseEntityExceptionHandler:

@ControllerAdvice
public class ErrorHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> 
    handleMethodArgumentNotValid(MethodArgumentNotValidException e,
                                 HttpHeaders headers, HttpStatus status,
                                 WebRequest request) {
        BindingResult bindingResult = e.getBindingResult();
        ArrayList<String> errors = new ArrayList<String>();
        for (ObjectError error : bindingResult.getGlobalErrors()) {
            errors.add(error.getDefaultMessage());
        }
        for (FieldError error : bindingResult.getFieldErrors()) {
            errors.add(
              String.format("%s %s", error.getField(), error.getDefaultMessage())
            );
        }
        return handleExceptionInternal(e, StringUtils.join(errors, ", "),
                headers, HttpStatus.UNPROCESSABLE_ENTITY, request);
}
0 голосов
/ 19 марта 2012

Вам нужно добавить BindingResult в ваш метод обработчика. Этот объект автоматически добавит результаты в Model, к которому можно легко получить доступ из библиотеки тегов Spring Forms.

...