1

웹 애플리케이션에서 Spring 4.0과 최신 스프링 보안을 사용 중이다. 나는 Hibernate 유효성 검사 5.1.1 결승전을 사용하고 싶다. 하지만 작동하지 않습니다. 내 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 기대하고있다 나는 의도적으로 사용자 이름 & 암호를 비워 두었으므로 항상 비어있는 것으로 나타났습니다.

@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(); 
    } 

} 

심지어 명시 적으로 검증 초기화하는 것을 시도했다 : 아래 그림과 같이뿐만 아니라 내 클래스에 주입하면 아래 그림과 같이

@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; 
    } 

지금까지 나는 또한 검증 빈을 초기화 헛된 시도 위의 그림과 같이 콩은 작동하지만 아무것도 보이지 않습니다. 다음은 검증 API에 관련된 내 부분 pom.xml 파일은 다음과 같습니다 당신은 발리 빈은

<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 통합을 제공합니다. 당신이 여기서 갈등을 겪고 있는지 궁금합니다. 그래서, 당신은 말합니다, 제약 조건 위반이없고, 예외도없고, 로그에 아무것도 없습니까? 그렇다면 디버깅을 시도하고 유효성 검사 호출에서 어떤 일이 일어나는지 확인하십시오. 또한 로그를 검사하여 어떤 Validator 버전 (있는 경우)이 부트 스트랩되는지 확인하는 것이 좋습니다. 또한 각 요청마다 유효성 검사기 팩토리를 만들지 않는 것이 좋습니다. 공장은 건설 비용이 많이 들기 때문에 캐싱해야합니다. 어노테이션 프로세서 jar btw는 필요하지 않습니다. – Hardy

+0

나는 하디가하는 말에 동의하지만, 왜 그것이 작동하지 않는지보고 싶었습니다. 그래서 올바른 밸리데이터를 사용하고 있는지 확인하기 위해 코드에서 팩토리를 만들어야합니다. –

답변

0

를 구성합니까?

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

이것은 classpath에있는 Hibernate Validator의 버전에 따라 Bean Validation 1.0 또는 1.1을 부트 스트랩합니다. 참고 사항 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 내 MVC 구성에서 LocalValidatorFactoryBean을 정의 할 필요가 없습니다.