专栏首页java 微风SpringMVC注解 @initbinder 解决类型转换问题

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();
    }
}

转自:https://www.cnblogs.com/soundcode/p/6519036.html

另一举例文章见 :SpringMvc 注解 @InitBinder 表单多对象精准绑定接收

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springCloud - 第5篇 - 断路器 Hystrix ( Feign 、Ribbon )

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Fe...

    微风-- 轻许--
  • 得当前时间的工具类

    原文链接:https://zhidao.baidu.com/question/878271990996467412.h...

    微风-- 轻许--
  • 《Spring Cloud 与 Docker 微服务架构实战》笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    微风-- 轻许--
  • SpringMVC注解@initbinder解决类型转换问题

    在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配...

    wuweixiang
  • SpringSecurity实现数据库认证

      上篇文章我们介绍了SpringSecurity系统认证的流程,我们发现系统认证其实是通过一个UserDetailService的实现类来实现的,所以我们就可...

    用户4919348
  • servlet/tomcat等容器/springMVC之间的关系

    Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一...

    Monica2333
  • 99%的java程序员都遇到过的笔试题

    这里咱们忽略空格,所以答案就是B,主要的是本道题考察的是Java语言中传参方式和不可变类的知识。

    用户4143945
  • 基于Netty实现Redis协议的编码解码器

    上面是Netty的服务器端基本消息处理结构,为了便于初学者理解,它和真实的结构有稍许出入。Netty是基于NIO的消息处理框架,用来高效处理网络IO。处理网络消...

    老钱
  • mvc一对多模型表单的快速构建

    Q:在实际的开发中,经常会遇到一个模型中包含有多个条目的表单。如何将数据提交到后台? A: 以数组的形式提交到后台就Ok了(真的那么简单么,如果再嵌套一层呢?...

    易墨
  • 如何优雅的用策略模式,取代臃肿的 if-else 嵌套,看这篇就够了

    Java的二十几种设计模式背的滚瓜烂熟,为什么这个时候不想着尝试用一下?说不定能轻松的解决掉哦

    程序员内点事

扫码关注云+社区

领取腾讯云代金券