如何利用spring验证器中的特定参数,我不能将参数合并到单个对象中?
说我有一个像
这样的控制器 @RequestMapping(value = "url",
consumes = { "application/json" }, produces = { "application/json" },
method = RequestMethod.POST)
public MyResponse getMyData(
@Valid @RequestBody MyRequest myRequest, Errors errors, CustomObject obj){
return new MyResponse();
}
我有一个用于更新 CustomObject
的方面实现 @Around("@annotation(MyAnnotation) && execution(* MyController.getMyData(..))")
public Object requestsAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
Object value = null;
CustomObject obj = new CustomObject();
try {
Object[] args = proceedingJoinPoint.getArgs();
//populate CustomObject
obj = (CustomObject)args[2];
obj.setField("value");
value = proceedingJoinPoint.proceed(args);
} catch (Throwable e) {
e.printStackTrace();
}
return value;
}
CustomObject的更新值我可以进入控制器。现在,我还需要使用弹簧自定义验证器验证 MyRequest ,
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new MyCustomValidator());
}
MyCustomValidator'验证()'功能是,
@Override
public void validate(Object target, Errors errors) {
validate((MyRequest)target);
}
方面和验证都是单独工作的,但是当两者都集成时,验证失败,因为验证方法中的目标考虑了 CustomObject '用于验证而不是使用' MyRequest '。 ' getMyData()'验证方法只接受两个参数。控制器中的方法有三个。如何解决这个问题,还是有其他办法来实现类似的解决方案?
答案 0 :(得分:0)
您可以尝试将要验证的对象的名称分配给 initBinder (使用对象实例的名称,而不是类)。
InitBinder("myRequest")
protected void initBinder(WebDataBinder binder) {
...
如果它不起作用,您可以尝试使用订单注释向方面下订单,或者执行订单< / strong>界面。
无论如何,我对前两个选项的正确性并不完全有信心,因为我无法测试代码(我从平板电脑回答)。所以,我建议第三个选项,你将验证放在控制器中
@RequestMapping(value = "url",
consumes = { "application/json" },
produces = {"application/json" },
method = RequestMethod.POST)
public MyResponse getMyData(
@RequestBody MyRequest myRequest, BindingResult result, CustomObject obj){
MyCustomValidator validator = MyCustomValidator();
validator.validate(myRequest, result);
if (result.hasErrors()){
// do something
}
return new MyResponse();
}