Как использовать разные коды ошибок для сообщений проверки?

У меня есть сервер Spring Boot REST, который должен возвращать определенные коды ошибок при вводе неверных данных. Мне здесь не нужны никакие i18n, достаточно простых английских кодов ошибок, таких как «отсутствует».

Используя Spring Boot с Hibernate Validator, после проверки я получаю обратный объект Spring Errors.

Для каждой ошибки я могу получить code и defaultMessage. Для ограничения @NotBlank это вернет NotBlank и may not be null соответственно.

По сути, я хочу перевести эту ошибку только на missing, так как меня не интересует перевод i18n. Также другие ограничения Я хочу, чтобы коды ошибок REST были более дружественными.

Я хотел использовать простой messages.properties или ValidationMessages.properties внутри src/main/resources, но, к сожалению, это не сработает. Примечание. Я пытался добавить как общие свойства NotBlank=missing, так и определенные свойства NotBlank.entity.field=missing.

Я не уверен, почему это не работает ... может быть, потому, что разрешение сообщений i18n (в мире jsp) идет не напрямую через Spring Errors, а через реализацию MessageCodesResolver (просто догадываюсь).

Вероятно, я мог бы получить код ошибки из Spring Error и выполнить поиск в преобразователе кода сообщения. Но мне интересно, почему error.getDefaultMessage не возвращает соответствующее значение из ValidationMessages.properties.

Любое предложение приветствуется.


person Marcel Overdijk    schedule 30.12.2014    source источник
comment
Потому что error.getDefaultMessage получает сообщение по умолчанию, и это сообщение, сгенерированное кодом, а не файлами свойств. Если вы посмотрите на файл MessageSource.getMessage вы видите, что передается defaultMessage. Тот же механизм используется при использовании проверки.   -  person M. Deinum    schedule 31.12.2014
comment
Спасибо за объяснение! Что бы вы предложили для продвижения?   -  person Marcel Overdijk    schedule 31.12.2014
comment
Вы можете просто передать ошибку (как есть) в MessageSource ошибки, возвращенные из объекта Errors, являются экземплярами MessageSourceResolvable. Так что просто переберите ошибки, передайте их MessageSource и получите нужное сообщение от messages.properties. Возможно, вы могли бы облагородить эту логику и поместить ее в класс, который генерирует объект ответа.   -  person M. Deinum    schedule 31.12.2014
comment
Да как я и сам предложил. Спасибо!   -  person Marcel Overdijk    schedule 31.12.2014
comment
Ну, вы предложили использовать код, вам не нужно этого делать, просто передайте объект как есть.   -  person M. Deinum    schedule 31.12.2014
comment
Ах хорошо, я понимаю, что вы имеете в виду.   -  person Marcel Overdijk    schedule 31.12.2014


Ответы (1)


Сообщение по умолчанию — это сообщение, указанное программистом. В случае с этими аннотациями JSR-303, вероятно, те, о которых думал Hibernate. Сообщение по умолчанию, включая код, передается в MessageSource.getMessage, который содержит параметр defaultMessage

Когда вы посмотрите на объект Errors или на метод ObjectError, вы увидите, что он реализует интерфейс MessageSourceResolvable. Это означает, что вы можете просто передать ошибку как есть в MessageSource, включая Locale, если хотите.

@RequestMapping
public Object foo(@Valid @RequestBody MyObject obj, Errors errors, Locale locale) {
    for (ObjectError err : errors.getAllErrors()) {
        String msg = messageSource.getMessage(err, locale);
        // Do something with msg
    }
}

Что-то вроде приведенного выше должно разрешить сообщение. Преимущество использования самого ObjectError заключается в том, что рядом с кодом у вас также есть параметры (для @Range или @Min), которые вы затем можете использовать в своем сообщении с заполнителями.

person M. Deinum    schedule 30.12.2014
comment
Сообщения по умолчанию валидатора Ps hibernate должны быть переопределены через ValidationMessages.properties, но, похоже, не работают (по крайней мере, в приложении Spring). См. также docs.jboss. org/hibernate/validator/5.1/reference/en-US/html/ - person Marcel Overdijk; 31.12.2014
comment
Правильно, потому что это переопределяет этот механизм, так что можно использовать MessageSource. ValidationMessages.properties применяется в простом JSR-303. Это объясняется в LocalValidatorFactoryBean javadoc. - person M. Deinum; 31.12.2014
comment
Хм, можно ли изменить это поведение весной? Итак, использовать ValidationMessages.properties? - person Marcel Overdijk; 31.12.2014
comment
Можем ли мы автоматически разрешить сообщение об ошибке, не вводя message source и locale в каждый из контроллеров? Это действительно проблематично, потому что я могу сделать это в аннотации спящего режима, но почему валидатор Spring не работает. - person Sam YC; 13.07.2017