对Spring Boot中请求字段的有条件验证

问题描述 投票:0回答:1

我刚刚开始进行请求正文的现场验证,并实现了所有基本的带注释的验证。我有一个依赖于其他字段的字段验证。

正在使用该类作为请求正文。

验证条件:

[如果value1.equals('OK')value2应该匹配特定的正则表达式模式,如果它不匹配正则表达式模式,则引发验证错误,说value2与正则表达式模式不匹配。

我试图创建一个自定义注释,但我不知道该怎么做以及如何使用它

Public class test
{
    String value1;
    String value2;
}

我希望针对该特定情况执行条件验证

java spring hibernate spring-boot bean-validation
1个回答
0
投票

有几种方法可以验证请求正文,换句话说就是实现服务器端验证。其中一些可以是

  1. 使用基本注释
  2. 创建用于定制验证的定制注释
  3. 创建用于自定义验证的自定义验证器

我最喜欢的是选项3。因此,我将在下面为选项3提供解决方案。步骤是

  1. 创建您的自定义验证器

    import org.springframework.stereotype.Component;
    import org.springframework.validation.Errors;
    import org.springframework.validation.ValidationUtils;
    import org.springframework.validation.Validator;
    
    @Component
    public class MessageValidator implements Validator {
    
    @Override
    public boolean supports(Class<?> clazz) {
        return Message.class.equals(clazz);
    }
    
    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "value1", "value1 is empty");
        ValidationUtils.rejectIfEmpty(errors, "value2", "value2 is empty");
        Message m = (Message) target; 
        if (m.getValue1().trim().equalsIgnoreCase("OK") && m.getValue2().matches(SOME_REGEX_PATTERN)) {
            errors.rejectValue("value2", "My custom validator is working");
        }
        }
      }
    
  2. [在您的控制器中将您的自定义验证器绑定到],模型>

      public class MainSiteController
      {
      @Autowired
      private MessageValidator messageValidator;
    
      @InitBinder("message")
      protected void initMessageBinder(WebDataBinder binder) {
        binder.addValidators(messageValidator);
      }
      }
    
  3. 将模型定义为有效并让控制器执行任务

  4. @PostMapping( path = "/saveMessage")
    public String saveNewMessage(@Validated Message message, BindingResult bindingResult){
        if (bindingResult.hasErrors()) {
            return "message";
        }
        myService.saveNewMessageModel(message);
        return "messageSaved";
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.