是否存在根据请求字段之一验证请求参数的声明方式?

时间:2018-03-05 14:11:54

标签: java spring validation http-request-parameters

我正在寻找像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)基于类信息决定,而不是实例信息。

提前致谢

1 个答案:

答案 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.