在调试Spring Boot应用程序时,我注意到为每个传入请求都调用了带有@InitBinder
注释的方法。
@InitBinder("categories")
public void bindFields(WebDataBinder binder) {
binder.registerCustomEditor(Set.class, new CustomPropertyEditor());
}
在@InitBinder
方法中,我们将PropertyEditor
设置为活页夹。我不明白为什么要一次又一次调用这些方法并设置相同的内容?
Spring是否为每个请求创建一个新的WebDataBinder
对象?
答案 0 :(得分:0)
@InitBinder
扮演着标识用于初始化WebDataBinder
的方法的角色。 Initbinder通常用于将requestParams绑定到自定义对象。
假设您的REST控制器用@InitBinder
注释,则在该控制器中处理的每个请求都将实例化Initbinder,而WebDatabinder
会将请求参数绑定到JavaBean对象。
它提供了分配验证器类的方法。使用addValidators()
和setValidator()
方法,我们可以分配验证器实例。
用例:假设1月20日星期日在请求参数中,并且您希望每次从请求参数中解析一个LocalDate
对象。您可以在WebDatabinder
中添加该解析器逻辑,并在每次发出请求时验证/解析该日期。
答案 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”)?
是的,这意味着此特定数据绑定定制将应用到模型属性或请求参数。您还可以提供名称数组。