У меня проблема с использованием аннотированной проверки весной 3 мвк.Я не уверен, что проблема в проверке или в способности Spring связывать ошибки проверки с объектом BindingResult.
Вот метод моего контроллера
@RequestMapping(value = "/test", method = RequestMethod.POST) public String testingValidation(@Valid Test test,BindingResult result){ if(result.hasErrors()){ logger.debug("Error in validation "+result.toString()); return "redirect:http://someWrongPlace.com"; } logger.debug("No validation error "+result.toString()); return "redirect:http://theRightPlace.com"; }
А вот моя формаobject
import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; public class Test { @NotNull @Size(min = 5) private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } }
Вот часть моего appContext (и да .. Все остальное работает нормально)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd" default-autowire="byName"> <mvc:annotation-driven/> <context:annotation-config/>
У меня есть Hibernate Validator и Validation API в моем классе
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>com.springsource.org.hibernate.validator</artifactId> <version>4.0.2.GA</version> </dependency>
Проблема в том, что я могу вызвать этот тест-метод с правильным URL-адресом ("/ test? Test = thisIsValidInput") и с недопустимым URL-адресом ("/ test? Test = a").Оба раза объект BindingResult не имеет ошибок.Отредактировано: я думаю, что у меня есть провайдер JSR-303 Validator в моем classpath.Я также смог запустить тест Junit для моих ограничений валидатора.Если загрузка валидатора происходит по-другому в Spring, может кто-нибудь объяснить это?Ниже мой тест Junit.
приватный статический валидатор валидатора;
Test test; @Before public void setUp(){ ValidatorFactory factory=Validation.buildDefaultValidatorFactory(); this.validator=factory.getValidator(); test = new Test(); } @Test public void testTextIsNotNull(){ test.setText(""); Set<ConstraintViolation<Test>>errors = validator.validate(message); Assert.assertEquals(1, errors.size()); logger.debug(errors.toString()); }
В консоли написано:
INFO [main] (Version.java:56) Hibernate Validator 4.0.2.GA DEBUG [main](ResourceBundleMessageInterpolator.java:193)ValidationMessages not found. Delegating to org.hibernate.validator.ValidationMessages DEBUG [main]defaultTraversableResolver.java:71)Cannot find javax.persistence.PersistenceUtil on classpath. All properties will per default be traversable. DEBUG [main] (ValidationXmlParser.java:218) No META-INF/validation.xml found. Using annotation based configuration only
Чтобы это работало, в вашем classpath должна присутствовать реализация провайдера jsr 303 (например, валидатора гибернации).Он автоматически подбирается весной, если таковой существует.