是否可以更改方法参数的约束验证器中的属性路径?
如果您熟悉 Bean 验证框架,您就知道您无法获得方法参数的名称。因此,如果您对方法的第一个参数执行@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 );
就是这样。现在,您的 ConstraintValidationException 将包含查询参数或 PathParam 的名称。例如:
public void getUser(
@NotNull @QueryParam( "emailAddress" ) String emailAddress,
@NotNull @QueryParam( "password" ) String password )
{ ... }