我正在寻找像JSR-303验证组(bean验证,在控制器中使用@Validated(GroupName.class)标记方法参数并在需要时在请求类字段中指定组),但它应该如何决定根据请求字段之一在运行时验证。
例如,如果我们有像这样的控制器类
@Controller
public class MyController {
@Autowired
private MyService myService;
@ResponseBody
@RequestMapping(value = "/path", method = RequestMethod.PUT)
public ResponseVo storeDetail(/*maybe some annotation here*/ DetailRequestVo requestVo) {
return myService.storeDetail(requestVo);
}
class DetailRequestVo {
String type;
Long weight;
Long radius;
}
}
我们希望验证取决于类型字段值:如果type =“wheel”则应显示radius和weight字段,如果type =“engine”则只显示weight字段。
Spring(截至3.2.17)是否提供API以更多的声明方式实现这些规则? org.springframework.validation.Validator在这里看起来不是一个选项,因为它的方法boolean supports(Class<?> clazz)
基于类信息决定,而不是实例信息。
提前致谢
答案 0 :(得分:1)
不确定Spring,但你可以使用普通的JSR-303使用自定义的Validator来实现这个...就像
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
@Constraint(validatedBy = TypeValidator.class)
@Documented
public @interface ValidType {
...
}
public class TypeValidator implements ConstraintValidator<ValidType , Object> {
public boolean isValid(final Object target, final ConstraintValidatorContext context) {
DetailRequestVo request = (DetailRequestVo) target;
// do your checks here
}
并使用
@ValidType
class DetailRequestVo {
String type;
Long weight;
Long radius;
}
由于自定义Validator可以访问整个DetailRequestVo-Object,因此您可以根据字段B等检查字段A.