![](/img/trans.png)
[英]initBinder method is not being called for conversion from String to Enum
[英]Why the @InitBinder method is called for every request?
在调试 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
添加该解析器逻辑,并在每次发出请求时验证/解析该日期。
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()); }
还有这个后续问题:
这是否意味着我们可以指定绑定将应用于哪个命令对象? 假设我们有处理由“user”和报告“report”表示的 2 个不同域对象 User 的多动作控制器,那么:@InitBinder("user") 注释方法将仅在绑定 User 对象和@InitBinder("report") 只在绑定 Report 时?
是的,这意味着该特定数据绑定自定义将应用到模型属性或请求参数。 您还可以提供名称数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.