如何手动使用org.springframework.validation.Validator validate()方法



我想从实现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
}
}

您的代码有点不清楚,MyValidator应该是MyValidation吗?我想你所缺少的只是应该调用哪个Validator以及为什么。

从您的逻辑来看,我认为您希望将javax.validation.Validator注入到MyService中。然后您只需要调用validator.validate(patchRequest(;它将返回Set<ConstraintViolation<PatchRequest>>

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

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

最新更新