2017-02-18 9 views
0

JEE7 Bean 유효성 검사는 CDI와 자동으로 통합됩니다. 예를 들어, CDI 컨테이너를 사용하는 경우 javax.validation.Validator를 주입하고 사용하여 빈이 일부 제약 조건을 위반하는지 확인하지 않아도됩니다. 그래서, 나는 같은 것을 할 필요가 없습니다 :Bean 유효성 검사와 CDI 통합 재정의 또는 비활성화

@Inject 
Validator validator; 

... 

SoccerPlayer player = new SoccerPlayer(); 
    player.setFirstName(firstName); 
    player.setLastName(lastName); 
    player.setAge(age); 

Set<ConstraintViolation<SoccerPlayer>> violations = validator 
      .validate(player); 

그러나

public class SoccerPlayer { 

@NotNull 
@Size(min = 5) 
private String firstName; 

@NotNull 
@Size(min = 5) 
private String lastName; 

@Max(50) 
@Min(value=16, groups = GoalKeeper.class) 
private int age; 

private String position; 

public SoccerPlayer() { 
} 

// Getters and setters omitted 
} 

자동 @Valid 주석을 확인할 수있는 다음의 SoccerPlayer 콩을.

public class SoccerPlayerProcessor {  

    public void processPlayer(@Valid SoccerPlayer player){ 
     // Do stuff with the player. 
    } 
} 

이 경우에는 유효성 검증 동작을 다양 화하기 위해 @Valid 주석과 함께 그룹을 사용할 수 없습니다.

그래서 내 목표를 달성 할 수있는 방법이 있습니까? 또는 다른 방법으로 콩 검증과 CDI 통합을 비활성화 할 수 있습니까? 내 사용자 정의 구현으로 기본 CDI javax.validation.Validator를 무시할 수 있습니까?

저는 WebSphere Liberty 프로파일을 어플리케이션 서버로 사용하고 있습니다.

미리 감사드립니다.

편집 : https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/validator-integration.html#section-integration-with-cdi

버전 1.1, 콩 검증이의 JavaTM EE에 대한 CDI (컨텍스트 및 의존성 삽입 (Dependency Injection)와 통합되어 있습니다 :

더 정확하게하려면,이 추출물이다).

이 통합 CDI는 검사기 및 ValidatorFactory에 대한 관리 빈을 제공하고, 제약 조건에 검증뿐만 아니라 사용자 지정 메시지 보간,에 이동 리졸버, 제약 유효성 검사기 공장 및 매개 변수 이름 제공자 의존성 주입을 가능하게한다.

또한 메소드 및 CDI 관리 Bean의 생성자에 대한 매개 변수 및 반환 값 제약 조건은 호출시 자동으로 유효성이 검사됩니다.

응용 프로그램이 Jave EE 컨테이너에서 실행되는 경우이 통합은 기본적으로 사용됩니다.

제 질문은,이 기본 동작을 비활성화하는 방법이 있습니까? 아니면 대체 CDI 인터셉터를 무시할 수 있습니까? 아니면 불가능한가요?

+0

"@ Valid' 어노테이션과 함께 그룹을 사용할 수 없다는 것은 무엇을 의미합니까? – Rouliboy

+0

GoalKeeper.class 그룹으로 SoccerPlayer의 유효성을 검사하고 싶습니다. AFAIK 나는 @Valid (groups = GoalKeeper.class)와 같은 것을 할 수 없다. 기본 Validator를 재정의 할 수 있으면 사용자 정의 주석 (예 : @Validate (groups = GoalKeeper.class) 그룹 필드가있는 Validate)으로 API에 주석을 달 수 있으며 Validator에서 주석이 달린 모든 bean을 수집하고 특정 그룹. – mancioshell

답변

1

@ConvertGroup을 사용하여 원하는 결과를 얻으십시오.

이전 예제에서 작성한 코드는 다음과 같습니다. 하나 이상의 @ConvertGroup 필요한 경우

public class SoccerPlayerProcessor {  

    public void processPlayer(@Valid @ConvertGroup(from=Default.class, to=GoalKeeper.class) SoccerPlayer player){ 
     // Do stuff with the player. 
    } 

같은 요소에 대해 여러 @ConvertGroup 주석을 개최 @ConvertGroup.List를 사용합니다.

+0

단위 테스트에서 validator.forExecutables(). validateParameters (..) 메서드를 사용하여 유효성 검사가 제대로 작동하는지 확인하는 것이 좋습니다. –