빈 검증 프레임 워크에 익숙하다면 메소드 인수의 이름을 얻을 수 없다는 것을 알고 있습니다. 따라서 메서드의 첫 번째 인수에서 @NotNull 제약 조건을 수행하고 유효성 검사가 실패하면 getPropertyPath는 "arg1"과 같은 형식이됩니다.Method 인수에 대한 ConstraintValidator의 속성 경로를 변경할 수 있습니까?
나는 값을 가질 수있는 @NotNull의 자체 버전을 만들고 싶습니다. @NamedNotNull ("emailAddress"). 그러나 Validator에서 #getPropertyPath를 재정의하는 방법을 알아낼 수 없습니까? 이 작업을 수행하거나 내가 "ARG1"또는 "ARG2"등
편집 붙어 오전하는 방법은 없나요 나는 다음과 같은 구현을 마련 할 수 있었다받은 답변에 따라
그 내 @QueryParam 또는 @PathParam 주석에서 값을 가져 와서 @NotNull과 같은 Bean 유효성 검사 주석의 속성 경로로 사용할 수 있습니다.
저지의 경우 다음 클래스를 만들어야합니다. DefaultParameterNameProvider의 구현을 참고 : 그거야
register(ValidationConfigurationContextResolver.class);
:
public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> {
@Override
public ValidationConfig getContext(final Class<?> type) {
final ValidationConfig config = new ValidationConfig();
config.parameterNameProvider(new RestAnnotationParameterNameProvider());
return config;
}
static class RestAnnotationParameterNameProvider extends DefaultParameterNameProvider {
@Override
public List<String> getParameterNames(Method method) {
Annotation[][] annotationsByParam = method.getParameterAnnotations();
List<String> names = new ArrayList<>(annotationsByParam.length);
for (Annotation[] annotations : annotationsByParam) {
String name = getParamName(annotations);
if (name == null)
name = "arg" + (names.size() + 1);
names.add(name);
}
return names;
}
private static String getParamName(Annotation[] annotations) {
for (Annotation annotation : annotations) {
if (annotation.annotationType() == QueryParam.class) {
return QueryParam.class.cast(annotation).value();
}
else if (annotation.annotationType() == PathParam.class) {
return PathParam.class.cast(annotation).value();
}
}
return null;
}
}
}
이 그런 다음 RestConfig 당신이 다음 줄을 추가해야합니다. 이제 ConstraintValidationExceptions에는 주석이 추가 된 QueryParam 또는 PathParam의 이름이 포함됩니다. 예를 들면 : 당신이 콩 검증 프레임 워크에 익숙하다면
public void getUser(
@NotNull @QueryParam("emailAddress") String emailAddress,
@NotNull @QueryParam("password") String password)
{ ... }
저지를 사용하지 않으면 어떻게됩니까? – Dejell
매우 유용합니다. 감사합니다. 나는 좀 더 정교함을 추가했다 : 'if (name == null) name = "payload ["+ parameterTypes [index] .getSimpleName() + "]", ""대신에 . Rest 메서드에서 검사 된 주석이없는 매개 변수 인 페이로드 유형을 제공합니다. 페이로드 DTO의 필드 (및 페이로드가 완전히 누락되어 있고 @NotNull 주석이있는 경우 페이로드 유형)의 유효성을 검사 할 때''Path ":"SomeResource.testValidation.payload [PayloadDto] .attributes "'를 제공합니다. –
PhiLho