如何将@requestBody映射到特定的initBinder方法?

时间:2017-08-09 20:18:59

标签: java spring spring-mvc

我的代码如下:

控制器

public String doStuff(@Valid @RequestBody MyClass obj, BindingResult result) {
  ... 
}

验证

@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
  binder.setValidator(new MyValidator());
}

问题是我不知道如何联系" obj param包含我需要运行的特定initBinder方法,以使用我的自定义Validator类自动验证obj。在@InitBinder param绑定到请求主体后,我需要一些方法来运行特定的obj方法。

此外,我必须使用@RequestBody,因为控制器方法在请求正文中接收JSON有效负载。

2 个答案:

答案 0 :(得分:1)

我认为将@InitBinder方法放在与doStuff()方法相同的Controller类中就足够了。

或者,您也可以为MyValidator创建自定义注释,并将其应用于MyClass中的课程级别,而不是使用@InitBinder。这还有一个额外的好处,即启动并运行任何方法调用,其中一个参数是@Valid MyClass obj

答案 1 :(得分:0)

如果您只有一个参数类型,那么将InitBinder与rorschach提到的控制器类相同就足够了。 否则,您可以指定要绑定到的参数的类名(以小写字母开头):

@InitBinder("myClass")
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
  binder.setValidator(new MyValidator());
}
public String doStuff(@Valid @RequestBody MyClass obj, BindingResult result) {
  ... 
}
@InitBinder("myClass2")
public void initBinder2(WebDataBinder binder, HttpServletRequest request) {
  binder.setValidator(new MyValidator2());
}
public String doStuff2(@Valid @RequestBody MyClass2 obj, BindingResult result) {
  ... 
}

我不确定它在文档中到底解释了什么,但是InitBinder的javadoc确实说了以下内容:

  

在此处指定模型属性名称或请求参数名称   将init-binder方法限制为特定的方法   属性/参数

所以我猜默认情况下,参数名是以小写字母开头的类的名称。