4

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

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

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

4

2 回答 2

2

@InitBinder起到识别用于初始化的方法的作用WebDataBinder。Initbinder 通常用于将 requestParams 绑定到自定义对象。

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

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

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

参考:spring MVC中init binder的作用是什么

于 2018-07-28T08:23:20.690 回答
1

Rossen Stoyanchev 在现已解散的Spring 论坛上的一篇文章中回答了这个问题: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());
}

还有这个后续问题:

这是否意味着我们可以指定绑定器将应用于哪个命令对象?假设我们有一个多动作控制器,它处理 2 个不同的域对象用户,由“用户”和报告“报告”表示,那么:@InitBinder(“用户”)注解的方法只会在绑定用户对象时被调用,并且@InitBinder("report") 仅在绑定报告时?

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

于 2020-08-31T13:39:56.697 回答