2013-04-16 2 views
3

JSR-303 구현으로 Hibernate Validator를 사용하고 있습니다.JSR-303 두 개의 자식 객체를 다르게 확인하는 방법

한다고 가정 내가 가진 :

class Form { 
    @Valid 
    private Owner mainOwner; 
    @Valid 
    private Owner secondOwner; 
    // ... many other fields 
} 

class Owner { 
    @DriverLicenseValid // some custom validation 
    private String driverLicense; 
    // ... many other fields 
} 

// ... 

Form myForm; 
validator.validate(myForm); 

참조, 나는 전체 양식을 확인하려면, 그것은 형식 소유자의 두 개의 유사한 하위 개체가 포함되어 있습니다. 문제는 mainOwner driverLicense는 @NotNull이고 secondOwner는 @Null이어야합니다.

하나의 validate() 호출로 전체 모델을 검사하므로 여기에서는 그룹을 사용할 수 없습니다. 이 규칙을 양식 수준의 사용자 지정 제약 조건으로 쓰지 않고도이 문제를 해결할 수있는 방법이 있습니까?

답변

0

mainOwner 필드에 Form의 유효성 검사 주석을 작성하여 Owner 인스턴스에 드라이버 라이센스가 있음을 검증합니다.

@DriverLicenseValid 주석은 null 값이 기본적으로 유효한 jsr-303 사양의 제안 사항을 따라야합니다. 따라서 Owner 클래스를 변경할 필요가 없습니다.

+0

감사합니다. 그러나이 문제는 양식 수준 (즉, mainOwner 필드 위)에서 맞춤 제약없이 달성 할 수 있는지 여부를 묻고 있습니다. 아마도 이것을 제대로 표현하지 못했을 것입니다. 그러나 당신이 나 자신을 생각한 똑같은 해결책을 제시하고 있기 때문에, 나는 다른 방법이 없다고 생각합니다. 좋습니다, 확실히 ScriptAssert는 할 것이지만, 사용자 정의 유효성 검사기 작성과 거의 같습니다. –

+1

@RodionGorkovenko이 작업을 수행하는 다른 합리적인 방법을 생각할 수 없습니다. 그래서 당신은 당신의 첫 생각을 고수해야합니다. – SpaceTrucker

0

Hibernate Validator 4.x로 작업하는 경우이 forum post에 설명 된대로 사용자 정의 그룹 시퀀스 공급자를 사용할 수 있습니다.

+0

이 케이스에서 어떻게 사용할 수 있는지 설명해 주시겠습니까? 소유자 클래스에 주석을 추가하면 getValidationGroups 메소드에서 Owner 인스턴스에 대한 링크 만 가져옵니다. 이 인스턴스를 통해 mainOwner 또는 secondOwner에서 참조 할 수 있는지 여부를 알 수 없습니다. 양식 자체에 주석을 달면 소유자의 유효성 확인을 위해 무엇을 제공하는지 이해할 수 없습니다. 내 어리 석음 때문에 미안해. –

+0

'Owner'인스턴스에 상태/역할을 지나쳐야합니다. 'private owner mainOwner = 새로운 소유자 ("main");'. 그런 다음 기본 그룹 시퀀스 공급자에서 역할에 액세스하여 올바른 기본 그룹 시퀀스를 반환 할 수 있습니다. – Gunnar

+0

아, 고마워. 분명히 내가 원하는 것은 아니지만. 어쨌든 유용한 정보를 주셔서 감사합니다. –