Как настроить сообщение об ошибке по умолчанию при проверке Spring @Valid?

var parseCurrency = function (e) {
    if (typeof (e) === 'number') return e;
    if (typeof (e) === 'string') {
        var str = e.trim();
        var value = Number(e.replace(/[^0-9.-]+/g, ""));
        return str.startsWith('(') && str.endsWith(')') ? -value: value;
    }

    return e;
} 
23
задан Disp Hay 12 November 2015 в 03:15
поделиться

3 ответа

Вы можете выполнить проверку с помощью объекта Errors / BindingResult. Добавьте аргумент Errors в ваш метод контроллера и настройте сообщение об ошибке при обнаружении ошибок.

Ниже приведен пример примера: errors.hasErrors () возвращает true, если проверка не удалась.

@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<String> saveUser(@Valid @RequestBody User user, Errors errors) {
    if (errors.hasErrors()) {
        return new ResponseEntity(new ApiErrors(errors), HttpStatus.BAD_REQUEST);
    }
    return new ResponseEntity<>(HttpStatus.OK);
}
19
ответ дан kswaughs 12 November 2015 в 03:15
поделиться

Я знаю, что это довольно старый вопрос,

Но я просто наткнулся на него и нашел довольно неплохую статью , которая также имеет прекрасный пример в github ].

В основном он использует @ControllerAdvice, как предполагает документация Spring.

Так, например, перехват ошибок 400 будет достигнут путем переопределения одной функции:

@ControllerAdvice
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(final MethodArgumentNotValidException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request) {
        logger.info(ex.getClass().getName());
        //
        final List<String> errors = new ArrayList<String>();
        for (final FieldError error : ex.getBindingResult().getFieldErrors()) {
            errors.add(error.getField() + ": " + error.getDefaultMessage());
        }
        for (final ObjectError error : ex.getBindingResult().getGlobalErrors()) {
            errors.add(error.getObjectName() + ": " + error.getDefaultMessage());
        }
        final ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(), errors);
        return handleExceptionInternal(ex, apiError, headers, apiError.getStatus(), request);
    }
}

(класс ApiError - простой объект для хранения состояния, сообщения, ошибок)

17
ответ дан Matan Lachmish 12 November 2015 в 03:15
поделиться
@ControllerAdvice(annotations = RestController.class)
public class GlobalExceptionHandler implements ApplicationContextAware {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public ApplicationError validationException(MethodArgumentNotValidException e) {

        e.printStackTrace();
        return new ApplicationError(SysMessageEnum.MSG_005, e.getBindingResult().getAllErrors().get(0).getDefaultMessage());

    }

}
2
ответ дан wscourge 12 November 2015 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: