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