@ InitBinder的价值元素的目的是什么?

时间:2017-03-01 14:24:01

标签: java spring annotations

我想了解@InitBinder。 我尝试将多个InitBinder用于多个Validator

@InitBinder("Validator1")
protected void initBinder1(WebDataBinder binder) {
    binder.setValidator(userFormValidator);
}

@InitBinder("Validator2")
protected void initBinder2(WebDataBinder binder) {
    binder.setValidator(costcenterFormValidator);
}

它对我不起作用,因为模型同时嵌套在包装类中,我也会做同样的验证

那么@InitBinder的值何时是一个好主意?

2 个答案:

答案 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";
}
}