我想了解@InitBinder。 我尝试将多个InitBinder用于多个Validator
@InitBinder("Validator1")
protected void initBinder1(WebDataBinder binder) {
binder.setValidator(userFormValidator);
}
@InitBinder("Validator2")
protected void initBinder2(WebDataBinder binder) {
binder.setValidator(costcenterFormValidator);
}
它对我不起作用,因为模型同时嵌套在包装类中,我也会做同样的验证
那么@InitBinder的值何时是一个好主意?
答案 0 :(得分:2)
根据javadoc,@ InitBinder中的值是此init-binder方法应该应用于的命令/表单属性和/或请求参数的名称。默认是应用于所有命令/表单属性以及由带注释的处理程序类处理的所有请求参数。在此处指定模型属性名称或请求参数名称将init-binder方法限制为那些特定属性/参数,使用不同的init-binder方法通常应用于不同的属性或参数组。
在您的情况下,您需要将@InitBinder注释的值设置为您希望它验证的模型属性的名称,而不是验证器的某些名称。对于userFormValidator,如果您的模型属性名称为 user ,则initbinder应为:
@InitBinder("user")
protected void initBinder1(WebDataBinder binder) {
binder.setValidator(userFormValidator);
}
如果costcenterFormValidator用于验证名为 costcenter 的模型属性,那么initbinder应为:
@InitBinder("costcenter")
protected void initBinder2(WebDataBinder binder) {
binder.setValidator(costcenterFormValidator);
}
答案 1 :(得分:0)
// For multiple validations use annotations in the initBinder and give proper name of the ModelAttribute in the initBinder.
@Controller
public class Controller {
private static final Logger logger = LoggerFactory.getLogger(Controller.class);
@InitBinder("ModelattributeName1")
private void initBinder(WebDataBinder binder) {
binder.setValidator(validator);
}
@Autowired
MessageSource messageSource;
@Autowired
@Qualifier("FormValidatorID1")
private Validator validator1;
@InitBinder("ModelattributeName2")
private void initBinder1(WebDataBinder binder) {
binder.setValidator(validator2);
}
@Autowired
@Qualifier("FormValidatorID2")
private Validator validator2;
@RequestMapping(value = "/submit_form1", method = RequestMethod.POST)
public String handleGetSubmission1(@Validated @ModelAttribute("ModelattributeName1") GetFormModel1 getFormModel1,
BindingResult result, Model model) {
model.addAttribute("getFormModel1", getFormModel1);
if (result.hasErrors()) {
return "get_Form1";
}
return "get_Complete1";
}
@RequestMapping(value = "/submit_form2", method = RequestMethod.POST)
public String handleGetJavaAppletSubmission(@Validated @ModelAttribute("ModelattributeName2") GetFormModel2 getFormModel2,
BindingResult result, Model model) {
System.out.println(result);
model.addAttribute("getFormModel2", getFormModel2);
if (result.hasErrors()) {
return "get_Form2";
}
return "get_Complete2";
}
}