2013-07-07 2 views
2

Java EE 6+에 수반되는 Bean Validation API에 대해 많이 읽었으며 유효성 검사 API의 작동 방식에 대한 기본 사항을 이해하고 있지만 지금까지 읽은 문서에서는 예제는 단위 테스트로, 유효성 검사 작업을 구현하는 데 도움이되지 않습니다.EJB를 사용한 Bean 유효성 확인

3 계층 아키텍처 시스템을 개발 중입니다. 유효성 검사 코드를 서비스 계층에 배치하고 싶습니다. 따라서 프레젠테이션 계층이 다른 경우 (예 : Jax-RS, JSF 등) 유효성 검사 코드를 다시 사용할 수 있습니다. 그러나 나는 그 작업을 구현하는 방법에 대해 혼란 스럽다. 여기에 내가 갇혀있다 :

나는 내 모델에서 다른 엔티티와 상호 작용하는 콩 있습니다. 나는 정말 그 방법에 액세스하기 위해 다시 빈을 인스턴스화 할 예정 건가요

Car object = new Car("Morris"); 
Method method = Car.class.getMethod("drive", int.class); 
Object[] parameterValues = { 80 }; 
Set<ConstraintViolation<Car>> violations = executableValidator.validateParameters(
     object, 
     method, 
     parameterValues 
); 

assertEquals(1, violations.size()); 
Class<? extends Annotation> constraintType = violations.iterator() 
     .next() 
     .getConstraintDescriptor() 
     .getAnnotation() 
     .annotationType(); 
assertEquals(Max.class, constraintType); 

:>

여기
public User getUser(
      @Min(value = 0, message = "Must have a positive userId") int uid) 
      throws RetrievalNotFoundException { 

     try { 

      // I WANT TO VALIDATE UID HERE 

      // find User with provided uid 
      User foundUser = em.find(User.class, uid); 

      // IF the user is inactive 
      if (foundUser.getIsActive() == 0) { 
       // cannot find the content 
       throw new RetrievalNotFoundException(); 
      } 

      // close the entity manager 
      em.close(); 
      // return the user 
      return foundUser; 


    } 

가 최대 절전 모드 문서의 예이다 - 예를 들어이 사용자 상호 작용에 대한 내 빈 내에서 방법은 getUser()? 나는 혼란 스럽다. 내가 가진 또 다른 질문은 누군가 int 컨테이너를 오버플로하는 uid를 int에 넣기로 결정하면 어떻게 될까요? 어떻게 그걸 확인하겠습니까?

도움을 주셔서 대단히 감사합니다. 정말 고맙습니다.

답변

4

몇 가지 의견을 보내주십시오. 먼저, Bean 유효성 검사는 실제로 EE 6 및 EE 7의 일부입니다. 그러나 EE 6에는 Bean Validation 1.0 만 포함되어 있지만 EE 7에는 Bean Validation 1.1이 포함되어 있습니다. 차이점은 Bean Validation 1.0에는 아직 메소드 유효성 검사가 포함되어 있지 않으며 이는 사용자가 예제에서 보여준 것입니다. Hibernate Validator는 버전 4부터 Hibernate Validator 특정 메소드 유효성 검증 API를 포함하고 있지만 이것은 표준의 일부가 아니며 Bean Validation 1.1과 Hibernate Validator 5에 명시된 것과 약간 다르다.

두 번째 주석은 필요한 코드와 관련이있다. 메서드 유효성 검사를 실행합니다. Bean 유효성 검증은 메소드 레벨 유효성 검증을 수행하는 메커니즘만을 제공합니다. 귀하의 예에서 언급 한 API입니다. 대부분의 경우이를 사용하기 위해 일종의 차단 기술이 필요합니다. 예를 들어 Java EE 7은 CDI 인터셉터를 사용하여 기본값별로 메소드 검증을 수행합니다. 그것은 표준의 일부입니다. http://beanvalidation.org/1.1/spec/#integration-cdi을 참조하십시오. EE 6을 사용하려면 원하는 기술을 사용하여 자체 차단 로직을 작성해야합니다.

마지막 질문에 관해서. 오버플로가 일반적으로 감지 할 수 있다고 생각하지 않습니다. 이 경우 Bean Validation이 할 수있는 일은 없습니다.

+0

감사합니다. 유용한 정보가 많이 있습니다. 실제로 glassfish 4.0 런타임 환경에서 Java EE 7을 사용하고 있습니다. 당신이 말한 것처럼 메소드 레벨 검증은 기본적으로 이루어집니다. 필자는 더 긴 매개 변수 목록을 가진 메서드에 대해 내 자신의 유효성 검사기를 작성해야하며 매개 변수에 대한 모든 제약 조건을 인라인하지 말아야한다고 생각합니다. 도움 주셔서 감사합니다. –

+1

수정, 글래스 피쉬 4를 사용하는 EE7은 내가 언급 한 스펙 섹션에 따라 메소드 유효성 검증이 가능합니다. 커스텀 제약 조건과 관련해서는 자신 만의 제약 조건을 만들 수는 있지만 주석이 어떻게 줄어들지는 알 수 없습니다. 물론 여러 구속 조건을 단일 구속 조건으로 결합하기를 원하지 않는 한. 물론 주석의 양을 매개 변수의 위치로 줄일 수 있습니다. – Hardy

관련 문제