将组动态设置为Spring Validator

时间:2019-03-11 23:28:43

标签: java spring validation spring-boot jpa

我正在实现Rest API,在其中我必须对请求正文进行一些验证。根据我在Json中名为“ type”的字段中定义的值,我想将组动态设置为Spring Validator。

通过查看文档,我发现的唯一解决方案是在方法签名处设置 @Validated 批注,并对要传递给它的组进行硬编码。

我从javax.validation包中找到了一个使用Validator的替代解决方案,并且我的代码现在看起来像这样:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<EnterpriseResource>> constraintViolationSet = new HashSet<>();
    if (isTypeEnterprise(enterpriseResource, EnterpriseTypeEnum.BUYER)) {
      constraintViolationSet = validator.validate(enterpriseResource, BuyerEnterprise.class);
    }
    if (isTypeEnterprise(enterpriseResource, EnterpriseTypeEnum.PROVIDER)) {
      constraintViolationSet = validator.validate(enterpriseResource, ProviderEnterprise.class);
    }
    if (!constraintViolationSet.isEmpty()) {
      log.info("=========================ERRORS: {}", constraintViolationSet.toString());
      throw new ConstraintViolationException(constraintViolationSet);
    }

有没有解决方法,以便可以使用Spring本机Validator实例获得相同的行为?

1 个答案:

答案 0 :(得分:0)

这是一个帮助程序类,它使用spring MVC验证程序,并允许您以编程方式指定验证组。

@Component
public class ValidatorTool {
   private static final Method method = ValidatorTool.class.getMethods()[0];

   @Autowired
   @Qualifier("mvcValidator")
   private org.springframework.validation.Validator validator;


   @SneakyThrows
   public void validate(Object object, Object... validationGroups) {
       DataBinder binder = new DataBinder(object);
       binder.addValidators(validator);
       binder.validate(validationGroups);
       BindingResult br = binder.getBindingResult();


       if (br.hasErrors()) {
          log.info("Validation of {} failed: {}", object.getClass(), br.getAllErrors());
          throw new MethodArgumentNotValidException(
                new MethodParameter(method, 0),
                br);
       }
   }
}