런타임에 주석/최대 절전 모드 검증 규칙을 변경하려면 어떻게해야합니까?
-
09-09-2019 - |
문제
일부 필드가있는 Java 클래스가있는 경우 Hibernate Validator를 사용하여 검증하려고합니다. 이제 사용자가 런타임에 유효성 검사가 발생하는 유효성 검사를 구성 할 수 있기를 원합니다.
예를 들어:
public class MyPojo {
...
@NotEmpty
String void getMyField() {
...
}
...
}
내가 제거하고 싶다고 가정 해 봅시다 NotEmpty
확인하거나 교체하십시오 Email
또는 CreditCardNumber
, 어떻게하니? 가능합니까? 런타임에 주석이 바뀌는 것 같아요 ...
해결책
정상적으로 할 수 없습니다.
Hibernate Validator를 통해보다 역동적 인 검증 작업을 수행하기 위해 수행 한 작업은 다음과 같습니다.
- 연장
ClassValidator
수업. - 무시하십시오
getInvalidVaues(Object myObj)
방법. 먼저 전화하십시오super.getInvalidValues(myObj)
, 그런 다음 사용자 정의 유효성 검사에 후크를 추가하십시오. - 사용자 정의 유효성 검사기를 인스턴스화하고 전화하십시오
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는 약간의 런타임 클래스 빌딩 자체를 수행합니다. 관심이 있다면 어떻게하는지 배울 수있는 좋은 장소 일 수 있습니다.