环境:Springboot2.4.12
简介
@Controller或@ControllerAdvice类可以有@InitBinder方法来初始化WebDataBinder的实例,这些方法可以:
- 将请求参数(即表单或查询数据)绑定到模型对象。
- 将基于字符串的请求值(如请求参数、路径变量、头、cookie等)转换为控制器方法参数的目标类型。
- 渲染HTML表单时,将模型对象的值格式化为字符串值。
@InitBinder方法可以注册控制器特定的java.bean.PropertyEditor或Spring Converter和 Formatter组件。另外,你可以使用MVC配置在全局共享的FormattingConversionService中注册Converter和Formatter类型。
@InitBinder方法支持许多与@RequestMapping方法相同的参数,除了@ModelAttribute(命令对象)参数。通常,它们是用WebDataBinder参数(用于注册)和一个void返回值声明的。
应用示例
@RestController @RequestMapping("/demos") public class DemoController { @InitBinder // 1 public void bind(WebDataBinder binder) { // 2 binder.registerCustomEditor(Long.class, new PropertyEditorSupport() { // 3 @Override public void setAsText(String text) throws IllegalArgumentException { setValue(Long.valueOf(text) + 666L) ; } }) ; } @GetMapping("/index") public Object index(Long id) { return "index - " + id ; } }
注意以下几点:
- 使用 @InitBinder 注解。
- 接收 WebDataBinder 参数。
- 注册自定义的转换器。
- 方法返回值必须是 void。
在上面的示例中注册了一个类型转换器从字符串转换为Long类型 并且在原来值基础上增加了666L。
原理解读
- HandlerAdapter 执行。
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, Initia