Как использовать проверку аннотации в Spring с сообщением об ошибке, полученным из файла свойств? - PullRequest
9 голосов
/ 26 апреля 2011

Я новичок в Spring.

Я настроил проверку в своем доменном классе следующим образом:

public class Worker {

    @NotNull(message="Name must be input")
    @Size(min=1,max=50, message="Name must not exceed 50 characters")
    private String name;
...

}

Вот файл jsp:

<form:input path="code" readonly="false" />
<font color="red"><form:errors path="code" />

И код контроллера:

@RequestMapping(value="/test",method=RequestMethod.POST)
    public void form(@Valid Worker worker, BindingResult result) {

        if (result.hasErrors()) {
            return;
        }
...

Это работает, но как я могу заменить «Имя не должно превышать 50 символов» на некоторый текст (например, worker.name.overflow) в моем messageSource?Могу ли я добавить messageResolver в BindingResult?

Похоже, что весь результат поиска говорит о написании пользовательского класса Validator, но сейчас я хочу использовать аннотацию.Я почти уверен, что есть выход, потому что в этом вопросе кто-то это сделал.

Ответы [ 2 ]

17 голосов
/ 26 апреля 2011

Чтобы сказать, что валидатор hibernate выполняет поиск кода, поместите значение сообщения в фигурные скобки.Например, @NotNull(message="{worker.name.NotNull}" затем поместите перевод в ValidationMessages.properties в корень вашего пути к классам.(/ WEB-INF / classes, папка resources в maven и т. Д.)

Реализация валидатора самостоятельно выполняет их поиск и использует BindingResult, уже переведенный как сообщение по умолчанию.Происходит за пределами источника сообщений Spring.Теоретически можно переопределить bean-компонент LocalValidatorFactory, чтобы поместить вывод сообщения валидатора в объект Errors в качестве кода, а затем оставить аннотации в скобках, чтобы Hibrenate Validator пропустил его.Исходный код, который превращает JSR-303 ConstraintViolations в подпружиненные ошибки, достаточно прост для чтения и расширения.Он просто помещает имя аннотации в виде кода, свойства аннотации в виде аргументов, а затем перевод валидатора в качестве сообщения по умолчанию.

Здесь можно увидеть это: https://src.springframework.org/svn/spring-framework/trunk/org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java

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

Вы можете добавить javax.validation.MessageInterpolator к вашему javax.validation.Configuration, чтобы указать ему искать сообщения в других файлах свойств.Если вы используете bean-компонент Spring LocalValidatorFactory, на нем есть setMessageInterpolator, который вы можете использовать для его внедрения.

Для спящего режима реализация провайдера: http://docs.jboss.org/hibernate/validator/4.1/api/org/hibernate/validator/messageinterpolation/ResourceBundleMessageInterpolator.html

4 голосов
/ 05 декабря 2013

Это немного объяснение проблемы.

@Size(min = 1, max = 50, message = "Email size should be between 1 and 50")

Теперь удалите {message = "Размер электронного письма должен быть от 1 до 50"} из тега проверки.

После этого ваша аннотация будет выглядеть следующим образом.

@Size(min = 1, max = 50)

Теперь на стороне контроллера отлаживайте метод, который вызывается при отправке формы.Ниже мой метод, который получает запрос, когда пользователь нажимает submit.

public static ModelAndView processCustomerLoginRequest(IUserService userService, LoginForm loginForm, 
    HttpServletRequest request, HttpSession session, BindingResult result, String viewType, Map<String, LoginForm> model)

Теперь поместите точку отладки в самую первую строку метода и отладьте аргумент "result".

BindingResult result

Во время дублирования вы найдете строку, подобную этой, в массиве кодов.

Size.loginForm.loginId

Теперь определите эту строку в вашем файле свойств и сообщение против этой строки.Скомпилируйте и выполните.Это сообщение будет отображаться всякий раз, когда эта аннотация не будет проверена.

Size.loginForm.loginId=email shouldn't be empty.

По сути, Spring создает свою собственную строку в качестве ключа к сообщению файла свойств.В приведенном выше ключе

Size(@Size) = validation annotation name
loginForm = My Class Name
loginId = Property name in LoginForm class.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...