Если вы знакомы с Bean Validation Framework, вы знаете, что вы не можете получить имя аргумента метода. Поэтому, если вы выполняете ограничение @NotNull для первого аргумента метода и проверка не выполняется, getPropertyPath будет что-то вроде "arg1".
Я хотел бы создать свою собственную версию @NotNull, которая может принимать значение, например. @NamedNotNull ( "emailAddress" ). Но я не могу понять, как переопределить #getPropertyPath в моем валидаторе? Есть ли способ сделать это, или я придерживаюсь "arg1" или "arg2" и т.д.
ИЗМЕНИТЬ
Основываясь на полученном ответе, я смог придумать следующую реализацию, которая позволяет мне принять значение из аннотаций @QueryParam или @PathParam и использовать их как путь свойств для Bean аннотации проверки, такие как @NotNull.
Для Джерси вам нужно создать следующий класс. Обратите внимание на реализацию 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 )
{ ... }