Dropwizard 1.X 跨参数方法验证无法生效该如何排查解决?
Dropwizard 1.X 跨参数方法校验不触发问题排查
问题根因与修复方案
方法访问权限错误
方法校验基于AOP实现,只能拦截public方法,你当前标注校验注解的
findAll是private方法,根本无法被切面拦截,自然不会触发校验逻辑,先把方法访问修饰符改为public。校验器泛型参数匹配错误
你实现的是跨参数的方法级校验,
ConstraintValidator的第二个泛型参数应该是Object[](对应方法的所有入参数组),你当前写的是String[],Hibernate Validator会因为类型不匹配直接跳过这个校验器的执行。修改后的校验器定义参考:@SupportedValidationTarget(ValidationTarget.PARAMETERS) public class AtLeastOneNotNullValidator implements ConstraintValidator<AtLeastOneNotNull, Object[]> { private String[] fieldNames; @Override public void initialize(AtLeastOneNotNull constraintAnnotation) { this.fieldNames = constraintAnnotation.fieldNames(); } @Override public boolean isValid(Object[] value, ConstraintValidatorContext context) { return false; } }缺少类级别校验启用标识
需要在你这个业务类的类上添加
@Validated注解,告知Hibernate Validator这个类需要执行方法级校验。冗余注解清理
方法上不需要加
@Valid注解,@Valid是用来触发参数内部的嵌套校验的,方法级跨参数校验只需要保留你自定义的@AtLeastOneNotNull注解即可;参数上的@Valid也没有作用,因为String是基础类型,没有嵌套属性需要校验。Dropwizard方法校验配置缺失
Dropwizard 1.X默认只开启Jersey资源层的请求参数校验,如果你要在自定义业务类中使用方法校验,需要在Application的run方法中注册方法校验特性:
environment.jersey().register(MethodValidationFeature.class);同时你需要保证你的业务类是被Jersey的HK2容器托管的(也就是通过
@Inject注入使用,而不是自己new出来的实例),否则切面无法生效。
内容的提问来源于stack exchange,提问作者shibel
相关产品推荐
相关产品推荐

