Вопрос Разъяснение
При использовании Hibernate Validator (HV) 4.2 с Spring MVC-4, например, с зависимостями:
dependencies {
providedCompile 'javax.servlet:javax.servlet-api:3.0.1'
compile 'org.springframework:spring-webmvc:4.0.3.RELEASE'
compile 'org.hibernate:hibernate-validator:4.2.0.Final'
runtime 'javax.servlet:jstl:1.1.2'
}
можно сказать Spring автоматически использовать HV для проверки вызовов методов классов, аннотированных @Validated
(как в примере Аскера), объявляя следующие бобы в файле конфигурации,
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
Когда метод цели вызывается и имеет что-то, что нарушает его ограничения, бросается MethodConstraintViolationException
. Например, будет поднят что-то вроде этого, если один happeded позвонить UserService#registerUser(...)
, передавая пустую строку в которой помечается @NotEmpty
... The following constraint violations occurred: [MethodConstraintViolationImpl
[method=public abstract void foo.UserService.registerUser(java.lang.String),
parameterIndex=0, parameterName=arg0, kind=PARAMETER, message=may not be empty,
messageTemplate={org.hibernate.validator.constraints.NotEmpty.message}, ...
Но проблема в том, если вы измените зависимости от выше
dependecies {
providedCompile 'javax.servlet:javax.servlet-api:3.0.1'
compile 'org.springframework:spring-webmvc:4.0.3.RELEASE'
compile 'org.hibernate:hibernate-validator:5.1.0.Final' //**note the change here**
runtime 'javax.servlet:jstl:1.1.2'
}
, то вы получите сообщение об ошибке:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'org.springframework.validation.beanvalidation.MethodValidationPostProcessor#0'
defined in class path resource [spring/config/web/main-config.xml]: Invocation of init
method failed; nested exception is javax.validation.ValidationException: Unable to
instantiate Configuration.
решение
Добавить еще 2 dependecies к следующим классам,
dependecies {
providedCompile 'javax.servlet:javax.servlet-api:3.0.1'
providedCompile 'javax.el:el-api:2.2'
providedCompile 'org.glassfish.web:el-impl:2.2'
compile 'org.springframework:spring-webmvc:4.0.3.RELEASE'
compile 'org.hibernate:hibernate-validator:5.1.0.Final' //**note the change here**
runtime 'javax.servlet:jstl:1.1.2'
}
И проверка будет возвращение к жизни. Но на этот раз, вместо MethodConstraintViolationException
, он поднимает ConstranitViolationException
без каких-либо подробностей о том, что было нарушено.
Я не уверен, как Весна справляется с этим внутренне, и вы можете развернуть детали нарушения из этого Исключения. HV 5 больше не поддерживает MethodConstraintViolationException
и его родственников, например. MethodValidator
, MethodConstraintViolation
. Это как-то связано с Bean Validation 1.1 specification, который имеет некоторые изменения в проверке уровня метода от BV 1.0. Я предлагаю создать службу валидации самостоятельно с использованием аспекта и с ExecutableValidator
(вместо старого MethodValidator
), как описано в HV's Reference guide.
Обратите внимание, что вы, если вы пытаетесь получить валидатор как это,
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
ExecutableValidator executableValidator = factory.getValidator().forExecutables();
вы можете получить ValidationException: Unable to instantiate configuration.
я могу решить эту проблему, сделать это
ValidatorFactory factory = Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory();
ExecutableValidator executableValidator = factory.getValidator().forExecutables();
Здесь нет никаких вопросов. – chrylis
В hibernate 4.2.0 есть packacge org.hibernate.validator.method для методов malidate, как validate с hibertnate validator 5.0.3 –