欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-19 20:28:56
在使用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();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。