详解SpringMVC注解@initbinder解决类型转换问题
程序员文章站
2022-05-03 10:22:47
在使用springmvc的时候,经常会遇到表单中的日期字符串和javabean的date类型的转换,而springmvc默认不支持这个格式的转换,所以需要手动配置,自定义数...
在使用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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。