【问题标题】:How to manually use org.springframework.validation.Validator validate() method?如何手动使用 org.springframework.validation.Validator validate() 方法?
【发布时间】:2022-08-22 13:07:14
【问题描述】:

我想从实现 org.springframework.validation.Validator 接口的验证器中手动调用 validate(Object target, Errors errors) 方法。当我在我的控制器类中将该验证器与 @InitBinder 绑定时,Spring 会发挥它的魔力并传递 Errors 对象本身。但是当手动调用此验证时,我无法弄清楚我自己应该从哪里得到这个 Errors 对象。为此类方法调用创建新的 BeanPropertyBindingResult() 确实有效,但是我不会像其他情况那样获得描述性错误响应主体。

是否有可能从某个地方获取 BeanPropertyBindingResult 对象以便手动使用我的验证?

或者也许有更好的方法来验证 PATCH 请求?它们很棘手,因为我必须先获取我正在更新的对象,然后才能运行验证。我想从 POST 请求中重复使用相同的验证。

@Controller
public class MyController {

  private final MyValidator myValidator;
  private final MyService myService;

  @InitBinder(\"postRequest\")
  public void initBinder(WebDataBinder binder) {
    binder.addValidators(myValidator);
  }

  // validation here in controller via @InitBinder works fine
  @PostRequest
  public void postWithBoundValidation(@RequestBody PostRequest request) {
    myService.doSomething(request);
  }

  // need to run same validations but in service
  @PatchRequest
  public void postWithManualValidation(@RequestBody PatchRequest request) {
    myService.doSomethingWithManualValidation(request);
  }
}
@Service
public class MyService {
  
  private final MyValidator myValidator;
  private final MyRepo myRepo;

  public void doSomething(PostRequest postRequest) {
    // do something
  }

  public void doSomethingWithManualValidation(PatchRequest patchRequest) {
    MyEntity entity = myRepo.findMyEntity();
    PostRequest postRequest = PostRequest.from(patchRequest, entity);
    
    // how to craft this Errors object correctly?
    Errors errors = new BeanPropertyBindingResult(postRequest, \"patchRequest\");

    // only now I should validate
    myValidator.validate(postRequest, errors);

    // do something
  }
}
@Component
public class MyValidator implements org.springframework.validation.Validator {
  @Override
  public boolean supports(...) {
    return true;
  }

  @Override
  public void validate(Object target, Errors errors) {
    // do some validations
  }

}

    标签: spring spring-boot spring-validator


    【解决方案1】:

    您的代码有点不清楚,MyValidator 应该是 MyValidation 还是反之亦然?我认为您所缺少的只是应该调用哪个Validator 以及为什么。

    从您的逻辑来看,我认为您想将javax.validation.Validator 注入您的MyService。然后你只需调用 validator.validate(patch Request);它将返回Set<ConstraintViolation<PatchRequest>>

    或者,只需使用您拥有的代码,在调用 myValidator.validate(postRequest, errors); 之后检查 errors 对象,例如

    if (errors.hasErrors()) {
      // do some funky stuff to handle the errors
    }
    

    【讨论】:

    • 但是我在哪里可以从 MyService 中获取 myValidator.validate(postRequest, errors) 的错误参数?
    • 你已经有了它,虽然我可能会稍微改变一下,这样读起来:new BeanPropertyBindingResult(postRequest, postRequest.getClass().getName());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多