我的代码如下:
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有效负载。
答案 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方法限制为特定的方法 属性/参数
所以我猜默认情况下,参数名是以小写字母开头的类的名称。