如果您熟悉Bean Validation Framework,那麼您知道無法獲取方法參數的名稱。因此,如果對方法的第一個參數執行@NotNull約束,並且驗證失敗,則getPropertyPath將類似於「arg1」。我可以更改Method參數的ConstraintValidator中的屬性路徑嗎?
我想創建我自己的@NotNull版本, @NamedNotNull(「emailAddress」)。但我無法弄清楚如何覆蓋我的Validator中的#getPropertyPath?有沒有辦法做到這一點還是我堅持「ARG1」或「ARG2」等
編輯
基於我收到我能想出以下實現的回答允許我從@QueryParam或@PathParam註釋中獲取值,並將它們用作Bean Validation註釋的屬性路徑(如@NotNull)。
對於Jersey,您需要創建以下類。注意DefaultParameterNameProvider執行:
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您需要添加下面一行:
register(ValidationConfigurationContextResolver.class);
就是這樣。現在你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()+「]」;' ,而不是'「arg」'。 這提供了有效負載的類型,在Rest方法中沒有檢查註釋的參數。當驗證有效載荷DTO的字段(以及有效載荷的類型(如果它完全缺失並具有@NotNull註釋)時,這會給出''路徑「:」SomeResource.testValidation.payload [PayloadDto] .attributes「。 –
PhiLho