在调试Spring Boot应用程序时,我注意到每个传入请求都会调用用@InitBinder
注释的方法。
@InitBinder("categories")
public void bindFields(WebDataBinder binder) {
binder.registerCustomEditor(Set.class, new CustomPropertyEditor());
}
在@InitBinder
方法中,我们将PropertyEditor
设置为绑定器。我不明白为什么要一次又一次地调用这些方法并设置相同的东西
Spring是否为每个请求创建一个新的WebDataBinder
对象?
@InitBinder
起到识别用于初始化WebDataBinder
的方法的作用。Initbinder通常用于将requestParams绑定到自定义对象。
假设您的REST控制器用@InitBinder
进行注释,则在该控制器中处理的每个请求都将实例化Initbinder,WebDatabinder
将请求参数绑定到JavaBean对象。
它提供了分配我们的验证器类的方法。使用addValidators()
和setValidator()
方法,我们可以分配我们的验证器实例。
用例:假设Sun,Jan 20在请求参数中,并且您希望每次从请求参数中解析一个LocalDate
对象。您可以在WebDatabinder
中添加解析器逻辑,并在每次发出请求时验证/解析该日期。
参考:spring MVC 中init binder的用途是什么
这似乎是Rossen Stoyanchev在现已停刊的春季论坛上的一篇帖子中回答的:https://web.archive.org/web/20181223143621if_/http://forum.spring.io/forum/spring-projects/web/555552为什么initbinder方法被多次调用:
WebDataBinder实例特定于模型属性。你可以验证为其创建数据绑定器的目标模型属性这个:
代码:
@InitBinder public void initBinder(WebDataBinder binder) { System.out.println("A binder for object: " + binder.getObjectName()); }
数据绑定器也用于@RequestParam,默认情况下init-binder方法用于所有模型属性和请求参数。
给定您拥有的请求参数和模型属性的数量,你最想做的是更具体地说明对象。例如:
代码:
@InitBinder("tasks") public void initBinder(WebDataBinder binder) { System.out.println("A binder for object: " + binder.getObjectName()); }
还有一个后续问题:
这是否意味着我们可以指定绑定器将应用于哪个命令对象?假设我们有多动作控制器,它处理2个不同的域对象User;用户";以及报告";报告";那么:@InitBinder("user"(注释的方法将仅在绑定user对象时调用,而@InitBinder("report"(仅在绑定report时调用?
是的,这意味着这是将应用此特定数据绑定自定义的模型属性或请求参数。您还可以提供一个名称数组。