当前位置: 首页 > news >正文

spring-webmvc @InitBinder 典型用法

典型用法

注册自定义类型转换器(PropertyEditor / Converter)

用于将请求参数中的字符串转换为特定类型,比如 Date、LocalDate 等。

@InitBinder
public void initDateBinder(WebDataBinder binder) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, false));
}

设置字段白名单(防止字段注入攻击)

有些字段是敏感字段,你不希望用户通过请求随意修改,比如 id、role、isAdmin 等。

@InitBinder
public void initFieldWhitelist(WebDataBinder binder) {binder.setAllowedFields("name", "email", "birthDate"); // 只允许这些字段被绑定
}

如果用户传了 id=123,Spring 将忽略这个字段,不会赋值给对象。

添加验证器(Validator)

结合 Validator 接口,可以对绑定后的对象进行业务规则校验。

@InitBinder
public void initValidator(WebDataBinder binder) {binder.addValidators(new UserValidator());
}

然后在控制器方法中使用 @Valid 启动验证:

@PostMapping("/users")
public String createUser(@Valid User user, BindingResult result) {if (result.hasErrors()) {return "error";}return "success";
}

多个 @InitBinder 方法(可按名称绑定)

你可以写多个 @InitBinder 方法,并指定它们只作用于某个类或字段名。

@InitBinder("user")
public void initUserBinder(WebDataBinder binder) {binder.setAllowedFields("name", "email");
}@InitBinder("product")
public void initProductBinder(WebDataBinder binder) {binder.setAllowedFields("name", "price");
}

与 @ControllerAdvice 结合实现全局配置

如果你希望所有控制器都共享某些绑定规则(如统一日期格式),可以使用 @ControllerAdvice + @InitBinder:

@ControllerAdvice
public class GlobalBindingConfig {@InitBinderpublic void globalInitBinder(WebDataBinder binder) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));}
}

这样所有控制器都会默认支持这种日期格式。

http://www.lryc.cn/news/571869.html

相关文章:

  • 架构优化——submodule转为subtree
  • ES 索引加载 vs BulkLoad
  • ArcGIS中利用泰森多边形法分析站点与流域占比
  • docker拉取Elasticsearch和Kibana
  • python3:线程管理进程
  • C++ 进阶:深入理解虚函数、继承与多态
  • 管件接头的无序抓取
  • C++11中alignof和alignas的入门到精通指南
  • 大语言模型指令集全解析
  • ATX电源
  • Java 淘宝商品详情接口实战解析
  • 小白成长之路-Rsync+sersync实现数据实时同步
  • 基于集体智能长尾识别的超声乳腺病变亚型分类|文献速递-深度学习医疗AI最新文献
  • 从零接入高德路径规划2.0:实现精准物流距离计算实战
  • FPGA基础 -- Verilog行为级建模之initial语句
  • C++11 移动语义详解
  • 基于大模型的胆囊结石全周期诊疗方案研究报告
  • vue3 javascript 多字段求和技巧
  • BitsAndBytes(简称 BnB)是一个用于“压缩”大语言模型的工具包
  • OpenStack入门
  • Karate UI 基本概念之一
  • python校园服务交流系统
  • 自动打电话软件设计与实现
  • cloudera manager 页面启动nodemanager失败,后端没有启动 8040
  • Python装饰器decorators和pytest夹具fixture详解和使用
  • 【强化学习】【笔记】【ch.10】GRPO / DAPO - 目前最优强化微调算法
  • openEuler安装BenchmarkSQL
  • AI Agent 与 Agentic AI 有何不同?
  • 7.索引库操作
  • 代码随想录算法训练营day8