Spring MVC 的数据绑定、转换器、属性编辑器

Spring MVC【四】数据绑定&JSON格式注解 Bean Wrapper(Bean封装器)和DataBinder(数据绑定器)是Spring中的两种数据绑定的实现。两者都实现了PropertyEditorRegister和TypeConverter接口,可以实现数据的类型转换。DataBinder还可以用来效验数据有效性,在SpringMVC容器中,使用WebDataBinder将前端请求参数转换为后端类型的对象,如果要处理JSON等类型的请求和响应,则需要结合HTTP消息转换器及@RequestBody和@ResponseBody注解。 一、Bean 阅读详情

转自:http://aokunsang.iteye.com/blog/1409505

一、数据绑定 

1、全局数据绑定

第一种方式,定义一个BaseController,在里面注册一个protected void ininBinder(WebDataBinder binder){},添加注解@InitBinder。【注解式】 

       此种方式一般不建议使用

第二种方式,定义一个类MyBinder实现WebBindingInitializer接口,同时实现其方法public void initBinder(WebDataBinder binder, WebRequest arg1) {}。【声明式】

在spring-mvc.xml中配置

一般大家可能省事,直接写了<mvc:annotation-driven/>来激活@Controller模式,它默认会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean,它们是springMVC为@Controllers分发请求所必须的。
但是如果你想用声明式注册一个数据绑定,你需要手动注册AnnotationMethodHandlerAdapter和DefaultAnnotationHandlerMapping。

 

Xml代码  收藏代码
  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>  <!-- 这个类里面你可以注册拦截器什么的 -->  
  2. <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>  
  3. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  4.     <property name="webBindingInitializer">  
  5.         <bean class="packagename.MyBinder"></bean>  <!-- 这里注册自定义数据绑定类 -->  
  6.     </property>  
  7.     <property name="messageConverters">  
  8.       <list>  
  9.         <ref bean="jacksonMessageConverter"/>    <!-- 注册JSON  Converter-->  
  10.       </list>  
  11.     </property>  
  12. </bean>  

 

 说明:此处org.springframework.http.converter.json.MappingJacksonHttpMessageConverter是必须配置的,否则在Controller方法前面加@ResponseBody,无法返回JSON,并报错。

同时需要引入两个jar包。jackson-core-asl.jar和jackson-mapper-asl.jar。

 

2、局部数据绑定

这个就简单了,直接在需要的绑定的Controller中,添加protected void ininBinder(WebDataBinder binder){  },并且添加注解@InitBinder就可以实现。例如:

 

Java代码  收藏代码
  1. @Controller  
  2. public class TestController{  
  3.     
  4.    //日期转换器,这样就会作用到这个Controller里所有方法上  
  5.    @InitBinder    
  6.     public void initBinder(WebDataBinder binder) {    
  7.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");    
  8.         dateFormat.setLenient(false);    
  9.         binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));  
  10.     }  
  11.      
  12.  ...各种增删改查方法  
  13. }  

 

 

四、转换器

 

 Spring提供了很多默认转换器,如StringToBooleanConverter,ObjectToStringConverter,NumberToCharacterConverter,ArrayToCollectionConverter,StringToArrayConverter,ObjectToCollectionConverter,ObjectToObjectConverter等等,如果需要自定义转换器,需要实现接口

  1. public interface Converter<S, T> { //S是源类型 T是目标类型  
  2.     T convert(S source); //转换S类型的source到T目标类型的转换方法  
  3. }

 我目前用到的转换器和数据绑定,基本都是对字段类型转换,两种方式都可以实现字符串到日期的转换。如:

Java代码  收藏代码
  1. public class CustomDateConverter implements Converter<String, Date> {  
  2.   
  3.     private String dateFormatPattern;  //转换的格式  
  4.   
  5.     public CustomDateConverter(String dateFormatPattern) {  
  6.             this.dateFormatPattern = dateFormatPattern;  
  7.     }  
  8.       
  9.     @Override  
  10.     public Date convert(String source) {  
  11.          if(!StringUtils.hasLength(source)) {  
  12.              return null;  
  13.          }  
  14.          DateFormat df = new SimpleDateFormat(dateFormatPattern);  
  15.          try {  
  16.              return df.parse(source);  
  17.          } catch (ParseException e) {  
  18.              throw new IllegalArgumentException(String.format("类型转换失败,需要格式%s,但格式是[%s]", dateFormatPattern, source));   
  19.          }  
  20.     }  
  21. }  

 配置文件有两种方式,

第一种比较简单:

Java代码  收藏代码
  1. <mvc:annotation-driven conversion-service="conversionService"/>  
  2. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
  3.  <property name="converters">  
  4.        <list>  
  5. <bean class="packagename.CustomDateConverter">  
  6.     <constructor-arg value="yyyy-MM-dd"></constructor-arg>  
  7. </bean>  
  8. lt;/list>  
  9.  </property>  
  10. </bean>  

 第二种,稍微麻烦点:

Java代码  收藏代码
  1. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
  2.    <property name="converters">  
  3.     <list>  
  4.         <bean class="packagename.CustomDateConverter">  
  5.             <constructor-arg value="yyyy-MM-dd"></constructor-arg>  
  6.         </bean>  
  7.     </list>  
  8.    </property>  
  9. </bean>  
  10. <bean id="myBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">    
  11.     <property name="conversionService" ref="conversionService"/>    
  12. </bean>  
  13. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  
  14.         <property name="webBindingInitializer" ref="myBinder"></property>  
  15. </bean>  

 

 

 

五、属性编辑器

1、在第三条中说了数据绑定,那么怎么能做到将String转换为Calendar或者Date呢。这里需要说的就是Spring的属性编辑器,感觉跟struts2的那个数据转换差不多。先看一段代码:

 

Java代码  收藏代码
  1. public void initBinder(WebDataBinder binder, WebRequest arg1) {  
  2.     //这里我定义了一个匿名属性编辑器将String转为为Calendar  
  3.         binder.registerCustomEditor(Calendar.class, new PropertyEditorSupport(){  
  4.         @Override  
  5.         public void setAsText(String text) throws IllegalArgumentException {  
  6.             Calendar cal = null;  
  7.             Date date = Util.convertDate(text);  
  8.             if(date != null){  
  9.                 cal = new GregorianCalendar();  
  10.                 cal.setTime(date);  
  11.             }  
  12.             setValue(cal);  
  13.         }  
  14.     });  
  15. }  

说明:用binder.registerCustomEditor()注册一个属性编辑器,来进行数据的转换操作。它有2种方式。

第一种binder.registerCustomEditor(Class clz,String field,PropertyEditor propertyEditor);这种方式可以针对bean中的某一个属性进行转换操作。clz为类的class,field为bean中的某一个属性,propertyEditor为编辑器。

第二种binder.registerCustomEditor(Class clz,PropertyEditor propertyEditor)。这种方式可以针对某种数据类型进行数据转换操作。如:将传递过来的String字符串转换为Calendar,这里就需要将clz设置为Calendar.class,propertyEditor为编辑器。

 

2、默认spring提供了很多种属性编辑器,可以在Spring-beans-3.0.5.jar的org.springframework.beans.propertyeditors包中看到。直接使用即可,如将String转换为Date类型:

 

Java代码  收藏代码
  1. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  2. binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, false));  

 


基于XGBoost的O2O优惠券核销预测实战指南 优惠券核销预测是本地生活服务中典型的二分类建模问题,其核心在于从用户行为、时空上下文与商户属性等多源异构数据中挖掘高价值决策信号。XGBoost凭借对缺失值鲁棒、自动捕获特征交互、天然支持类别特征等优势,成为该场景下兼顾可解释性与工程落地性的首选模型。技术价值体现在能精准识别‘高潜力核销用户’,显著降低无效发券成本;典型应用场景包括外卖平台动态发券、到店团购精准触达、社区团购补贴优化等。本文聚焦O2O业务语义驱动的数据清洗、时间感知特征构建、时序合规验证及SHAP可解释策略生成,覆盖从原始日志到可执行运营动 阅读详情

相关推荐

springmvc自定义属性编辑器和参数解析器

springmvc自定义属性编辑器和参数解析器

SpringMVC中数据绑定及自定义类型转换器

这篇博客记录一下SpringMVC中的数据绑定,以及如何自定义类型转换器 数据绑定 Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数...

weixin_44339867的博客 363

深入解析PVT corner:从wcl到ml的芯片设计关键考量

本文深入解析了芯片设计中的PVT corner概念,重点探讨了从传统WC到先进工艺下WCL、ML等关键工艺角。文章详细阐述了温度反转效应如何使低温WCL成为最严苛的时序场景,并提供了基于先进工艺的实战签核策略与多角多模分析流程,确保芯片在极端工艺、电压、温度下的稳健性。

tree8的博客 527

时间调用的方法Date和Calendar

关于时间的操作:1.创建时间的对象,获取系统当前的时间Date date = new Date();这样我们可以获取当前系统时间,但是输出来的格式为西方时间格式,所以我们需要简单的将它转化为中文时间格式的2018年7月4日,或2018-7-4的格式这时候就要借用SimpleDateFormat这个类来进行转换,这个类位于java.TexT中;SimpleDateFormat format = ne...

jinqianwang的博客 984

MATLAB/simulink电力系统之变压器仿真+变压器饱和仿真+空载变压器电流畸变原因及仿真+空载合闸励磁涌流仿真+simulink免费仿真资源

单相变压器空载运行时,原边电流主要用来产生主磁场,而电路损耗和铁芯损耗很小,因此即使外加电压很大,空载电流仍然很小。如果想观察某个相对磁导率下电感系数的数值,可以在程序中增加这样的语句,比如,在程序中end语句之后,加上L(100),运行程序后就可以得到相对磁导率为 100时的电感系数值。在交流铁芯线圈中,当交变磁通按照正弦规律变化时,受到磁路饱和的影响,线圈中的电流会发生畸变,并成为尖顶波,这就是所谓的交流磁路电流畸变。需要指出,铁芯内的主磁通Ф可以通过空载时的副边电压从来测量,两者之间的数学关系,即。

m0_37724753的博客 4230

SpringMVC之数据绑定和自定义类型转换器

1、数据绑定流程 Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中 调用...

qq_43687990的博客 382

【具身算法】VLA算法-Diffusion Policy

《扩散策略:多模态机器人控制的新方法》摘要 本文提出了一种基于扩散模型的机器人控制策略(DiffusionPolicy),用于解决视觉运动控制中的多模态行为、高维动作空间和训练稳定性问题。该方法利用去噪扩散概率模型(DDPM)生成动作序列,通过迭代优化处理复杂动作分布,显著提升了性能。实验表明,在15项机器人操作任务中,扩散策略平均性能提升46.9%,有效解决了传统显式/隐式策略的局限性。其核心优势在于:1)优雅建模多模态动作分布;2)适应高维动作空间;3)训练过程稳定。未来工作将探索与强化学习的结合及计算

puzhinan7781的博客 1391

浅谈springMVC的拦截器、错误异常、数据绑定、转换器、属性编辑器

一、拦截器 上篇博文中已经说到过可以继承HandlerInterceptorAdapter类或者实现HandlerInterceptor接口。 这里想说的是对于其方法中一个参数的说明。   /** * Controller之前执行 */ @Override public boolean preHandle(HttpServlet...

aokunsang的博客 238

点云语义分割:RandLANet模型推理C++部署(2)

一、数据读取及预处理 二、模型推理 三、结果保存

zhaoguanhua的博客 3800

matlab 点云泊松盘采样

本文介绍了泊松盘采样算法在三维点云处理中的应用。该算法通过最小间距约束(任意两点距离≥r)和均匀分布特性,生成高质量、均匀分布的点集。文章详细阐述了参数设置(如采样半径、候选点数),并与体素栅格、随机采样等方法进行了对比。代码实现部分展示了MATLAB版本的泊松盘采样算法,包括KD树加速和候选点生成机制。实验结果表明,该方法能有效保持点云特征,适用于点云简化、曲面重建等场景。文中还提供了参数调整建议和不同应用场景下的使用指导。

点云侠的博客 537

Spring MVC数据转换

样例:把一个字符串封装而一个对象。 如:username:password格式的数据ZhangSan:1234。我们把这个数据封装成一个User对象。以下分别使用属性编辑器与转换器来实现。 1、自己定义属性编辑器 A、写一个属性编辑器继承PropertyEditorSupport package cn.framelife.mvc.converter; im...

weixin_34245749的博客 148

FanucROBOGUIDE软件二次开发:使用ROBOGUIDEAPI进行编程

菜单栏:位于界面顶部,提供文件、编辑、视图、插入、格式、工具、窗口和帮助等选项。工具栏:包含常用的工具按钮,如新建、打开、保存、运行、停止、机器人控制等。工作站视图:显示工作站的3D模型,用户可以在这里放置机器人、工件、工具和其他设备。机器人控制面板:用于控制机器人运动,包括手动移动、程序编辑和运行。程序编辑器:在这里可以编写和编辑机器人程序,支持Fanuc的R-30iB Plus和R-30iB控制柜的程序格式。状态栏:显示当前工作站的状态信息,如机器人位置、程序状态等。

kkchenjj的博客 1409

参数数据绑定

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34111819的博客 131

基于STM32L4XX、HAL库的ESP32-S3-WROOM-1-N4 WIFI模块驱动程序设计

/ 检查是否收到完整的一行(以\r\n结尾)// 例如: 解析AT命令响应或MQTT消息等。// UART2初始化已在CubeMX中配置。// USART2初始化函数(由CubeMX生成)// 缓冲区溢出,重置。// 如果需要等待响应。// 处理接收到的数据。// 处理接收到的数据。// 等待ESP32模块启动。// 主循环其他任务。// 启用UART全局中断。// 发送HTTP GET请求。// 发送AT测试命令。// 连接Wi-Fi。// UART中断回调函数。

zhusl6688的博客 286

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SpringMvc参数解析器源码分析(三)—数据类型转换

SpringMvc 参数解析的过程中需要进行数据类型的转换,如String变int,date变Long……,在类型转换的过程中还需要对数据的格式进行校验。 Java中的属性编辑器 PropertyEditor PropertyEditor是属性编辑器的接口,它规定了将外部设置值转换为内部JavaBean属性值的转换接口方法。 public interface Property...

Lili429的博客 769

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

springMVC之@InitBinder的用法

@InitBinder从字面意思可以看出这个的作用是给Binder做初始化的`@InitBinder主要用在@Controller中标注于方法上(@RestController也算),表示初始化当前控制器的数据绑定器(或者属性绑定器),只对当前的Controller有效。@InitBinder标注的方法必须有一个参数WebDataBinder。所谓的属性编辑器可以理解就是帮助我们完成`参数绑定`,然后是在请求到达controller要执行方法前执行!

怪咖@的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

2021-06-04

@InitBinder public void initBinder(WebDataBinder binder){ binder.registerCustomEditor(String.class,new StringTrimmerEditor(true)); binder.registerCustomEditor(Date.class,new CustomDateEditor()); } @PostMapping("test") public void test(AstAssetVO ..

墨鱼第二大脑 181

springMVC学习笔记四(数据类型转换和数据验证)

=============================数据类型转换和数据验证======================= 数据类型转换 Spring 内建的 PropertyEditor 如下所示: 类名                         说明                                默认是否注册 ByteArrayPropertyEdit

retacn_yue的专栏 4000

Spring中的类型转换

以下是一些需要类型转换的简单情况: 情况1。 为了帮助简化bean配置,Spring支持属性值与文本值之间的转换。 每个属性编辑器仅设计用于某些类型的属性。 为了使用它们,我们必须在Spring容器中注册它们。 案例2。 同样,在使用Spring MVC时,控制器会将表单字段值绑定到对象的属性。 假设对象是由另一个对象组成的,则MVC控制器无法自动将值分配给内部自定义类型对象,因为表单中...

最佳 Java 编程 871

Spring MVC 数据类型转换

Spring MVC 数据类型转换 通过webBindingInitializer的propertyEditorRegistrars来定义框架级别默认的全局转换通过conversionService来定义业务级别的全局转换通过@InitBinder来定义当前Controller范围的转换 ...

weixin_30881367的博客 93

Spring MVC 数据绑定利器:深入理解 @InitBinder

​@InitBinder​ 是 Spring MVC 提供的一个非常有用的特性,它允许我们深入数据绑定的核心,定制请求参数到方法参数的转换逻辑。注意: 这个 @InitBinder​ 只对 URL 参数、表单数据等生效,不影响 @RequestBody​ 接收的 JSON 数据中的日期解析(那个由 Jackson 控制,需要 @JsonFormat​)。​@DateTimeFormat​ 和 @NumberFormat​ 等注解是字段/参数级别的,用于标准、明确的格式化需求,使用起来更简单直接。

m0_73762612的博客 1260

【Spring MVC数据绑定终极指南】:深入掌握@InitBinder的5种高级用法

掌握Spring MVC的@InitBinder用法,精准解决数据绑定与类型转换难题。涵盖日期格式化、自定义编辑器、表单对象绑定等5大应用场景,提升控制器健壮性与灵活性。实战示例解析,值得收藏。

FastCompile的博客 818

Spring 注册属性编辑器PropertyEditor

Servlet中的输入参数为都是string类型,而spring mvc通过data bind机制将这些string 类型的输入参数转换为相应的command object(根据view和controller之间传输数据的具体逻辑,也可称为model attributes, domain model objects)。在这个转换过程中,spring实际是先利用java.beans.Prop...

toy 267

Spring MVC【三】数据类型转换

一、类型转换 JDK在界面Bean开发技术中提供了PropertyEditor接口,实现该接口的类可以达成字符串类型和特定类型的转换。Spring核心框架提供了基本类型的属性编辑器实现。另外,Spring还提供了转换器(Converter)和转换服务(ConversionService)用来实现任意对象类型之间的转换。Converter和PropertyEditor的功能相似,ConversionService则是不同类型转换器的容器,包含不同类型的转换器。 1.属性编辑器:PropertyEditor

风继续吹 911
上一篇: 格式化Spring MVC 返回json的Date格式
下一篇: 关于hashCode方法的作用
lld2002
博客等级 码龄19年 15粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值