为什么对每个请求都调用@InitBinder方法?

时间:2018-07-28 07:10:20

标签: java spring spring-boot data-binding spring-mvc-initbinders

在调试Spring Boot应用程序时,我注意到为每个传入请求都调用了带有@InitBinder注释的方法。

@InitBinder("categories")
public void bindFields(WebDataBinder binder) {
    binder.registerCustomEditor(Set.class, new CustomPropertyEditor());
}

@InitBinder方法中,我们将PropertyEditor设置为活页夹。我不明白为什么要一次又一次调用这些方法并设置相同的内容?
Spring是否为每个请求创建一个新的WebDataBinder对象?

2 个答案:

答案 0 :(得分:0)

@InitBinder扮演着标识用于初始化WebDataBinder的方法的角色。 Initbinder通常用于将requestParams绑定到自定义对象。

假设您的REST控制器用@InitBinder注释,则在该控制器中处理的每个请求都将实例化Initbinder,而WebDatabinder会将请求参数绑定到JavaBean对象。

它提供了分配验证器类的方法。使用addValidators()setValidator()方法,我们可以分配验证器实例。

用例:假设1月20日星期日在请求参数中,并且您希望每次从请求参数中解析一个LocalDate对象。您可以在WebDatabinder中添加该解析器逻辑,并在每次发出请求时验证/解析该日期。

参考:What is the purpose of init binder in spring MVC

答案 1 :(得分:0)

Rossen Stoyanchev在now defunct春季论坛上的帖子中似乎回答了这一问题:https://web.archive.org/web/20181223143621if_/http://forum.spring.io/forum/spring-projects/web/55552-why-does-initbinder-method-get-called-multiple-times

WebDataBinder实例特定于模型属性。您可以 验证为数据绑定创建目标模型的属性,例如 这个:

代码:

@InitBinder
public void initBinder(WebDataBinder binder) {
    System.out.println("A binder for object: " + binder.getObjectName());
}

数据绑定器也用于@RequestParam,默认情况下 init-binder方法用于所有模型属性和请求 参数。

鉴于您拥有的请求参数和模型属性的数量, 您最可能想做的是更具体地了解 您的InitBinder方法适用的对象。例如:

代码:

@InitBinder("tasks")
public void initBinder(WebDataBinder binder) {
    System.out.println("A binder for object: " + binder.getObjectName());
}

还有一个后续问题:

这是否意味着我们可以指定将活页夹应用于哪个命令对象?假设如果我们有一个处理两个不同域对象User(由“ user”表示和Report“ report”表示)的多动作控制器,则:只有在绑定User对象和对象时,才会调用@InitBinder(“ user”)带注释的方法。仅在绑定报表时使用@InitBinder(“ report”)?

是的,这意味着此特定数据绑定定制将应用到模型属性或请求参数。您还可以提供名称数组。