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

9

ичок весны.

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

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   ответа
4

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

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

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

После этого ваша аннотация будет такой.

@Size(min = 1, max = 50)

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

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.
17

поместите значение сообщения в фигурные скобки. например.,@NotNull(message="{worker.name.NotNull}" затем поместите перевод в ValidationMessages.properties в корень вашего пути к классам. (/ WEB-INF / classes, папка ресурсов в 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

извините за мою ошибку, я пропустил часть о размещении ValidationMessages.properties в пути к классам. Я был бы очень благодарен, если бы вы могли показать мне, как изменить это местоположение по умолчанию? Hoàng Long
localValidatorFactoryBean.setMessageInterpolator (новый ResourceBundleMessageInterpolator (новый AggregateResourceBundleLocator (Arrays.asList ("my.package.MyFileName", "my.other.package.AnotherFileName")))); Affe
В любом случае вы можете быть более точным при изменении местоположения файла свойств? Я использую весну, но ваше объяснение звучит как греческий для меня! markthegrea
Я сделал как ваш первый абзац: поместите имя файла ValidationMessages.properties в WEB-INF и добавьте фигурные скобки для сообщения, но это не изменится. Кажется, что ValidationMessages.properties не найден. Hoàng Long
Конечно, см. Отредактированный ответ Affe

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