Я использую Spring 4.0 и последнюю версию Spring Security в своем веб-приложении. Я хочу использовать проверку Hibernate 5.1.1 Final. Но это не работает. Тот же код работает в моем JUNIT, но не в веб-приложении.Hibernate Validator 5.1.1 не работает в веб-приложении
Код, который работает:
@Test
public void testUserAuthenticationRequestValidation(){
try{
UserAuthenticationRequest req=new UserAuthenticationRequest().addUserName("bla").addPasswd("passw");
Validator validation=Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<UserAuthenticationRequest>> constraintViolations= validation.validate(req);
Assert.assertTrue("There are some errors", constraintViolations.size()>0);
System.out.println(constraintViolations);
}catch(Exception ex){
ex.printStackTrace();
Assert.fail();
}
Но если я пытаюсь использовать один и тот же код в моем веб-приложение, он не работает, В коде ниже, я ожидаю contraintViolation установить не быть пустым потому что я намеренно оставил имя пользователя & пустым, но я всегда нахожу его пустым.
@Override
public UserDetails retrieveUser(String username,
UsernamePasswordAuthenticationToken authentication)
throws AuthenticationException {
LOGGER.debug("About to check authentication for username: {}", username);
final UserAuthenticationRequest userData = new UserAuthenticationRequest()
.addUserName(username).addPasswd(
authentication.getCredentials().toString());
Validator validation = Validation.buildDefaultValidatorFactory()
.getValidator();
Set<ConstraintViolation<UserAuthenticationRequest>> constraintViolations = validation
.validate(userData);
LOGGER.info("Constraints Violations: {}", constraintViolations);
LOGGER.info("Obejct: username: {} password: {}",
userData.getUsername(), userData.getPasswd());
UserDetailVO userDetailVO = new UserDetailVO(
userInfoService.authenticate(userData));
return userDetailVO;
}
До сих пор я также тщетно пытался инициализации боб проверки, как показано ниже, и инъекционные в моем классе, а также, как показано ниже:
@Configuration
@ComponentScan({ "com.sell.mystuff.web.security",
"com.sell.mystuff.web.service" })
@ImportResource({ "classpath*:spring/common-context.xml" })
public class CommonAppContext {
@Bean(name = "javaxValidator")
public Validator getValidator() {
return Validation.buildDefaultValidatorFactory().getValidator();
}
}
Я даже пытался явно инициализированы в проверке как показано выше, но ничего не работает. Ниже мой частичный файл pom.xml, связанный с проверкой API:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>5.1.1.Final</version>
</dependency>
Пара вещей. Во-первых, Spring поставляется с собственной интеграцией Bean Validation. Мне интересно, работаете ли вы в конфликтах здесь. Итак, вы говорите, что в журналах нет никаких ограничений, никаких исключений и ничего нет? Если да, попробуйте отладки и посмотрите, что происходит в вызове проверки. Я также рекомендую проверить журнал, чтобы узнать, какая версия проверки (если есть) загрузочная. Кроме того, я настоятельно рекомендую не создавать фабрику валидатора по каждому запросу. Завод стоит дорого, и его следует кэшировать. Вам не нужен бит-комментарий для аннотаций. – Hardy
Я согласен с тем, что вы говорите, но я хотел понять, почему он не работает. Вот почему я должен создать фабрику в коде, чтобы убедиться, что я использую правильный валидатор. –