런타임에 주석/최대 절전 모드 검증 규칙을 변경하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/750890

문제

일부 필드가있는 Java 클래스가있는 경우 Hibernate Validator를 사용하여 검증하려고합니다. 이제 사용자가 런타임에 유효성 검사가 발생하는 유효성 검사를 구성 할 수 있기를 원합니다.

예를 들어:

public class MyPojo {
    ...

    @NotEmpty
    String void getMyField() {
        ... 
    }

    ...
}

내가 제거하고 싶다고 가정 해 봅시다 NotEmpty 확인하거나 교체하십시오 Email 또는 CreditCardNumber, 어떻게하니? 가능합니까? 런타임에 주석이 바뀌는 것 같아요 ...

도움이 되었습니까?

해결책

정상적으로 할 수 없습니다.

Hibernate Validator를 통해보다 역동적 인 검증 작업을 수행하기 위해 수행 한 작업은 다음과 같습니다.

  1. 연장 ClassValidator 수업.
  2. 무시하십시오 getInvalidVaues(Object myObj) 방법. 먼저 전화하십시오 super.getInvalidValues(myObj), 그런 다음 사용자 정의 유효성 검사에 후크를 추가하십시오.
  3. 사용자 정의 유효성 검사기를 인스턴스화하고 전화하십시오 getInvalidValues 검증하기 위해. 이 시점에서 모든 최대 절전 모드 주석 유효성 검사가 시작되며 사용자 정의 동적 검증 (주석에 의해 지원되지 않는 것)도 시작됩니다.

예시:

public class MyObjectValidator extends ClassValidator<MyObject>
{
    public MyObjectValidator()
    {
         super(MyObject.class);
    }

    public InvalidValue[] getInvalidValues(MyObject myObj)
    {
        List<InvalidValue> invalids = new ArrayList<InvalidValue>();
        invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));

        // add custom validations here
        invalids.addAll(validateDynamicStuff(myObj));

        InvalidValue[] results = new InvalidValue[invalids.size()];
        return invalids.toArray(results);
    }

    private List<InvalidValue> validateDynamicStuff(MyObject myObj)
    {
        // ... whatever validations you want ...
    }

}

따라서 사용자 정의 유효성 검사 코드는 "사용자가 구성 한 경우이 유효성 검사를 수행하십시오. 그렇지 않으면 해당 작업을 수행하십시오"등의 논리를 포함 할 수 있습니다. 당신이하고있는 일은 최대 절전 모드 유효성 검사기의 '정상적인'사용 사례가 더 관련이 있습니다.

다른 팁

실제로 최대 절전 모드 유효성 검사기 4.1에서 가능합니다. 문서를 읽으십시오 프로그래밍 방식의 제약 제작.

나는 당신이 주석을 제거하거나 변경할 수 없다고 생각합니다. 그것은 클래스 정의의 일부입니다. 런타임에 가능하지만 약간 관여하는 새로운 클래스를 구축 할 수 있습니다. 최대 절전 모드는 검증에 대한 프로그래밍 방식 액세스를 지원하고 주석을 무시할 수 있습니다. API를 잘 모릅니다. Hibernate는 약간의 런타임 클래스 빌딩 자체를 수행합니다. 관심이 있다면 어떻게하는지 배울 수있는 좋은 장소 일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top