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



在调试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时调用?

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

最新更新