SpringMVC注解@initbinder解决类型转换问题

简介:

在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题。
在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。
WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。
代码如下:

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

需要在SpringMVC的配置文件加上

<!-- 解析器注册 -->  
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="stringHttpMessageConverter"/> </list> </property> </bean> <!-- String类型解析器,允许直接返回String类型的消息 --> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/> 

换种写法

<mvc:annotation-driven>
    <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> </mvc:message-converters> </mvc:annotation-driven>

拓展:
spring mvc在绑定表单之前,都会先注册这些编辑器,Spring自己提供了大量的实现类,诸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。
使用时候调用WebDataBinder的registerCustomEditor方法
registerCustomEditor源码:

public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor) { getPropertyEditorRegistry().registerCustomEditor(requiredType, propertyEditor); }

第一个参数requiredType是需要转化的类型。
第二个参数PropertyEditor是属性编辑器,它是个接口,以上提到的如CustomDateEditor等都是继承了实现了这个接口的PropertyEditorSupport类。
我们也可以不使用他们自带的这些编辑器类。
我们可以自己构造:

import org.springframework.beans.propertyeditors.PropertiesEditor;

public class DoubleEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (text == null || text.equals("")) { text = "0"; } setValue(Double.parseDouble(text)); } @Override public String getAsText() { return getValue().toString(); } }
 
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/6519036.html,如需转载请自行联系原作者
相关文章
|
4月前
|
Java 编译器
你说啥什么?注解你还不会?
你说啥什么?注解你还不会?
34 0
|
4月前
|
安全 前端开发 Java
注解的使用
注解的使用
38 0
|
10月前
|
Java 编译器 数据库连接
注解
注解是JAVA5引入JAVA的一个特性,理解起来会有点抽象,这里笔者先给出自己对注解的一个理解——注解就是一张便签! 其次要有一个概念就是注解的应用是基于反射的。 本文举出的三个实例中例1和例3是引用其它的优秀文献 出处为how2J以及 https://blog.csdn.net/briblue/article/details/73824058一文
43 0
|
11月前
@ControllerAdvice注解
@ControllerAdvice注解
|
11月前
@PostMapping注解
@PostMapping注解
|
Java 测试技术 Spring
关于@RunWith注解的一点问题
IDEA写springboot测试关于@Runwith的小问题
142 0
关于@RunWith注解的一点问题
ControllerAdvice注解的用法
可以看出ControllerAdvice本质上是一个Component,因此也会被当做组件扫描
ControllerAdvice注解的用法
|
程序员
注解和反射2.内置注解
注解和反射2.内置注解
|
编译器
注解与反射.1什么是注解?
注解与反射.1什么是注解?
|
Java 编译器
注解以及注解在反射中的应用
注解以及注解在反射中的应用
78 0