【发布时间】: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