1

Я использую 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> 
+0

Пара вещей. Во-первых, Spring поставляется с собственной интеграцией Bean Validation. Мне интересно, работаете ли вы в конфликтах здесь. Итак, вы говорите, что в журналах нет никаких ограничений, никаких исключений и ничего нет? Если да, попробуйте отладки и посмотрите, что происходит в вызове проверки. Я также рекомендую проверить журнал, чтобы узнать, какая версия проверки (если есть) загрузочная. Кроме того, я настоятельно рекомендую не создавать фабрику валидатора по каждому запросу. Завод стоит дорого, и его следует кэшировать. Вам не нужен бит-комментарий для аннотаций. – Hardy

+0

Я согласен с тем, что вы говорите, но я хотел понять, почему он не работает. Вот почему я должен создать фабрику в коде, чтобы убедиться, что я использую правильный валидатор. –

ответ

0

У вас есть валидатор боб настроен?

<bean id="validator" 
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

Это самонастройки Bean Validation 1.0 или 1.1, в зависимости от того, какая версия Hibernate Validator вас на пути к классам. См. Также http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html

Даже если вы планируете вручную вызывать проверку, вы должны сделать это, извлекая настроенный фабричный компонент, поскольку это гарантирует правильное кэширование фабрики.

+0

Да, у меня это настроено в определении моих бобов. –

0

я получил эту работу, добавив более позднюю версию javax.el

например

<dependency> 
    <groupId>javax.el</groupId> 
    <artifactId>javax.el-api</artifactId> 
    <version>3.0.0</version> 
</dependency> 

BTW Мне не нужно было определять LocalValidatorFactoryBean в моей конфигурации mvc весны.

 Смежные вопросы

  • Нет связанных вопросов^_^