Проверка Spring 3 (JSR-303) @Min

Я пытаюсь проверить поле ввода, которое должно содержать (если не пустое) натуральное число (т.е. положительное целое число, отличное от нуля: 1, 2, 3, ....)

Я использую следующие аннотации:

@Digits(integer=10, fraction=0)
@Min(value = 1)
private Long number;

(Это лучший способ описать мое ограничение???)

Когда я отправляю такое число, как 1,5, я получаю СООБЩЕНИЕ О ПРОВЕРКЕ, что хорошо. Однако, когда я отправляю ввод, такой как -1, я не получаю никакого СООБЩЕНИЯ О ПРОВЕРКЕ. Что мне не хватает?

Спасибо!

P.S. Поскольку мои (другие) аннотации Hibernate для этого поля были в геттере поля, я просто перемещаю эти две аннотации в геттер (вместо того, чтобы быть в фактическом поле). Не помогло.

ИЗМЕНИТЬ

Я только что прочитал, что мне может понадобиться добавить <mvc:annotation-driven /> в мой XML. Я сделал это, однако при запуске сервера я получаю исключение:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/mvc] Offending resource: ServletContext resource [/WEB-INF/dispatcher-servlet.xml]

Я не уверен, что это значит, и если мне действительно нужен (????) этот тег, управляемый аннотациями... кроме того, если мне нужен этот тег, управляемый аннотациями, в моем xml, почему другие мои аннотации (включая одну из аннотации проверки) работают без него?


person rapt    schedule 17.08.2011    source источник


Ответы (3)


Вам нужен тег <mvc:annotation-driven />. Это то, что говорит Spring Web MVC активировать проверку JSR-303.

Несколько вещей, которые нужно проверить:

1) Убедитесь, что вы объявили префикс пространства имен mvc в своей конфигурации dispatcher-servlet.xml. Например (используя Spring 3 здесь):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    ...
</beans>

2) Также убедитесь, что у вас есть Spring Web MVC JAR в вашем пути к классам. JAR содержит обработчик пространства имен, который знает, как обрабатывать пространство имен конфигурации MVC.

3) Убедитесь, что Hibernate Validator находится в пути к классам. Это нужно Spring для выполнения проверки.

Что касается вашего вопроса о том, почему другие ваши аннотации сработали: <mvc:annotation-driven> не несет ответственности за все аннотации, а только за некоторые из них. Одна вещь, за которую он отвечает, — это проверки JSR-303, как отмечалось выше.

Что касается того, почему ваша другая проверка сработала, я предполагаю, что эта проверка вообще не сработала. Вместо этого, когда вы пытаетесь поместить 1.5 в Long, Spring не может этого сделать, и вы, вероятно, получаете какое-то сообщение об ошибке. Я не думаю, что вам вообще нужна аннотация @Digits. Если вы удалите его, я предполагаю, что вы все равно получите сообщение.

person Community    schedule 17.08.2011
comment
Спасибо! У меня было (1) (2) (3). Что мне пришлось изменить, так это банки: я изменил все свои банки Spring с 3.0.0 на 3.0.5, и теперь @Min работает. Спасибо за объяснение, почему @Min сработал. Вы правы в том, что @Digits не требуется... 1. но каков механизм, который дает мне (довольно приятное) сообщение об ошибке вместо того, чтобы видеть трассировку стека исключений? 2. Как я могу изменить сообщение об ошибке, например. для целого числа. 3. Какова обычная практика проверки одного из примитивов? Нет необходимости в какой-либо конкретной аннотации, как в случае с Integer? - person rapt; 18.08.2011
comment
4. Не всегда понятно, что должны делать аннотации: преобразовывать ввод в правильный формат (если возможно), например. преобразовать 1,5 в 1, когда bean-компонент ожидает получить целое число; или отклонить ввод, если он не совпадает (например, с @Min). Например: @NumberFormat, кажется, принимает числа, которые не соответствуют шаблону, и просто преобразует их в правильный шаблон. Пока @DateTimeFormat отклоняет даты, которые не соответствуют шаблону, nad выводит сообщение об ошибке. Хотя они оба являются аннотациями Spring (не JSR-303). Буду признателен за любые пояснения и/или ссылки на соответствующие веб-страницы. - person rapt; 18.08.2011

Вы должны дополнительно явно указать Spring для проверки вашего bean-компонента в точке привязки, используя @Valid, можете ли вы подтвердить, что делаете это. Я предполагаю, что ошибка, которую вы получаете с 1,5 в качестве ввода, просто потому, что 1,5 нельзя поместить в длинное поле и является исключением привязки, а не исключением проверки.

person Biju Kunjummen    schedule 17.08.2011
comment
Я, конечно, указал аннотацию @Valid для своего командного объекта. Метод моего контроллера выглядит следующим образом: public ModelAndView list(HttpServletRequest request, HttpServletResponse response, @Valid Book book, BindingResult result) throws Exception {...} И НЕТ, сообщение об ошибке, которое я получаю, связано с проверкой @Digits, а не с обязательным исключением. Без использования какой-либо проверки, если я ввожу отрицательное целое число (например, -1), это действует так, как будто я ничего не вводил (что нормально и то, что я ожидал). Странно то, что с этими двумя аннотациями работает только @Digits. - person rapt; 17.08.2011
comment
Я видел ваше второе редактирование, эта ошибка связана с тем, что вам нужен spring-webmvc jar (3.0+) в вашем пути к классам. Требуется mvc:annotation-driven, это приводит к тому, что валидатор для JSR303 загружается как bean-компонент. Кроме того, в моих локальных проектах также присутствуют jar validation-api и реализация hibernate hibernate-validator-4.1.0.Final.jar. - person Biju Kunjummen; 17.08.2011
comment
Спасибо! Я изменил все свои банки Spring с 3.0.0 на 3.0.5, и теперь я @Min работает. См. выше мои комментарии к Вилли Уиллеру. - person rapt; 18.08.2011

Если это целое число, почему бы не сделать его Integer? Кроме того, это должно быть @Min(1).

person atrain    schedule 17.08.2011
comment
Я имел в виду целое число в математическом смысле. Он может быть больше Integer, поэтому я использую Long. Я думаю, что @Min(1) - это просто аббревиатура, в любом случае Eclipse предлагает @Min(value = ). - person rapt; 17.08.2011