关闭

SpringMVC之绑定参数的类型转换(Date/Double)

标签: spring mvc
4424人阅读 评论(0) 收藏 举报
分类:

一、使用注解式控制器注册PropertyEditor(针对具体的controller类处理)

        1、使用WebDataBinder进行控制器级别的注册PropertyEditor(控制器独享)

Java代码  收藏代码
  1. @InitBinder  
  2. // 此处的参数也可以是ServletRequestDataBinder类型  
  3. public void initBinder(WebDataBinder binder) throws Exception {  
  4.     // 注册自定义的属性编辑器  
  5.     // 1、日期  
  6.     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  7.     //CustomDateEditor类是系统内部自带的类  
  8.     CustomDateEditor dateEditor = new CustomDateEditor(df, true);  
  9.     // 表示如果命令对象有Date类型的属性,将使用该属性编辑器进行类型转换  
  10.     binder.registerCustomEditor(Date.class, dateEditor);  
  11.     // 自定义的电话号码编辑器(和【4.16.1、数据类型转换】一样)  
  12.     binder.registerCustomEditor(PhoneNumberModel.classnew PhoneNumberEditor());  
  13. }  

 

        备注:转换对象必须要实现PropertyEditor接口,例如CustomDateEditor类

 

Java代码  收藏代码
  1. package org.springframework.beans.propertyeditors;  
  2.   
  3. import java.beans.PropertyEditorSupport;  
  4. import java.text.DateFormat;  
  5. import java.text.ParseException;  
  6. import java.util.Date;  
  7. import org.springframework.util.StringUtils;  
  8.   
  9. public class CustomDateEditor extends PropertyEditorSupport {  
  10.   
  11.     private final DateFormat dateFormat;  
  12.     private final boolean allowEmpty;  
  13.     private final int exactDateLength;  
  14.       
  15.     public CustomDateEditor(DateFormat dateFormat, boolean allowEmpty) {  
  16.         this.dateFormat = dateFormat;  
  17.         this.allowEmpty = allowEmpty;  
  18.         exactDateLength = -1;  
  19.     }  
  20.   
  21.     public CustomDateEditor(DateFormat dateFormat, boolean allowEmpty, int exactDateLength) {  
  22.         this.dateFormat = dateFormat;  
  23.         this.allowEmpty = allowEmpty;  
  24.         this.exactDateLength = exactDateLength;  
  25.     }  
  26.   
  27.     public void setAsText(String text) throws IllegalArgumentException {  
  28.         if (allowEmpty && !StringUtils.hasText(text)) {  
  29.             setValue(null);  
  30.         } else {  
  31.             if (text != null && exactDateLength >= 0 && text.length() != exactDateLength)  
  32.                 throw new IllegalArgumentException((new StringBuilder("Could not parse date: it is not exactly")).append(exactDateLength).append("characters long").toString());  
  33.             try {  
  34.                 setValue(dateFormat.parse(text));  
  35.             } catch (ParseException ex) {  
  36.                 throw new IllegalArgumentException((new StringBuilder("Could not parse date: ")).append(ex.getMessage()).toString(), ex);  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41.     public String getAsText() {  
  42.         Date value = (Date) getValue();  
  43.         return value == null ? "" : dateFormat.format(value);  
  44.     }  
  45.   
  46. }  

 

二、使用xml配置实现类型转换(系统全局转换器)

     (1)注册ConversionService实现和自定义的类型转换器 

Xml代码  收藏代码
  1. <!-- ①注册ConversionService -->  
  2. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
  3.     <property name="converters">  
  4.        <list>  
  5.             <bean class="hb.base.convert.DateConverter">  
  6.                 <constructor-arg value="yyyy-MM-dd"/>  
  7.             </bean>  
  8.         </list>  
  9.     </property>  
  10.     <!-- 格式化显示的配置  
  11.     <property name="formatters">  
  12.         <list>  
  13.             <bean class="hb.base.convert.DateFormatter">  
  14.                 <constructor-arg value="yyyy-MM-dd"/>  
  15.             </bean>  
  16.         </list>  
  17.     </property>  
  18. -->  
  19. </bean>  

 

    (2)使用 ConfigurableWebBindingInitializer 注册conversionService

Xml代码  收藏代码
  1. <!-- ②使用 ConfigurableWebBindingInitializer 注册conversionService -->  
  2. <bean id="webBindingInitializer"  
  3.     class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">  
  4.     <property name="conversionService" ref="conversionService" />  
  5.     <property name="validator" ref="validator" />  
  6. </bean>  

 

    (3)注册ConfigurableWebBindingInitializer 到RequestMappingHandlerAdapter

Xml代码  收藏代码
  1. <!--Spring3.1开始的注解 HandlerAdapter -->  
  2. <bean  
  3.     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  
  4.     <!--线程安全的访问session -->  
  5.     <property name="synchronizeOnSession" value="true" />  
  6.     <property name="webBindingInitializer" ref="webBindingInitializer"/>  
  7. </bean>  

 

       此时可能有人会问,如果我同时使用 PropertyEditor 和 ConversionService,执行顺序是什么呢?内部首先查找PropertyEditor 进行类型转换,如果没有找到相应的 PropertyEditor 再通过 ConversionService进行转换。

三、直接重写WebBindingInitializer(系统全局转换器)

      (1)实现WebBindingInitializer接口

package org.nercita.core.web.springmvc;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.core.convert.ConversionService;
import org.springframework.validation.BindingErrorProcessor;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;

/**
 * Created by IntelliJ IDEA.
 * Date:
 * Time: 下午2:50.
 */
public class CustomBindInitializer implements WebBindingInitializer {
    private String format = "yyyy-MM-dd";

    private boolean autoGrowNestedPaths = true;

    private boolean directFieldAccess = false;

    private MessageCodesResolver messageCodesResolver;

    private BindingErrorProcessor bindingErrorProcessor;

    private Validator validator;

    private ConversionService conversionService;

    private PropertyEditorRegistrar[] propertyEditorRegistrars;

    public void setAutoGrowNestedPaths(boolean autoGrowNestedPaths) {
        this.autoGrowNestedPaths = autoGrowNestedPaths;
    }

    public boolean isAutoGrowNestedPaths() {
        return this.autoGrowNestedPaths;
    }

    public final void setDirectFieldAccess(boolean directFieldAccess) {
        this.directFieldAccess = directFieldAccess;
    }

    public boolean isDirectFieldAccess() {
        return directFieldAccess;
    }

    public final void setMessageCodesResolver(MessageCodesResolver messageCodesResolver) {
        this.messageCodesResolver = messageCodesResolver;
    }

    public final MessageCodesResolver getMessageCodesResolver() {
        return this.messageCodesResolver;
    }

    public final void setBindingErrorProcessor(BindingErrorProcessor bindingErrorProcessor) {
        this.bindingErrorProcessor = bindingErrorProcessor;
    }

    public final BindingErrorProcessor getBindingErrorProcessor() {
        return this.bindingErrorProcessor;
    }

    public final void setValidator(Validator validator) {
        this.validator = validator;
    }

    public final Validator getValidator() {
        return this.validator;
    }

    public final void setConversionService(ConversionService conversionService) {
        this.conversionService = conversionService;
    }

    public final ConversionService getConversionService() {
        return this.conversionService;
    }

    public final void setPropertyEditorRegistrar(PropertyEditorRegistrar propertyEditorRegistrar) {
        this.propertyEditorRegistrars = new PropertyEditorRegistrar[]{propertyEditorRegistrar};
    }

    public final void setPropertyEditorRegistrars(PropertyEditorRegistrar[] propertyEditorRegistrars) {
        this.propertyEditorRegistrars = propertyEditorRegistrars;
    }

    public final PropertyEditorRegistrar[] getPropertyEditorRegistrars() {
        return this.propertyEditorRegistrars;
    }


    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.setAutoGrowNestedPaths(this.autoGrowNestedPaths);
        SimpleDateFormat sf = new SimpleDateFormat(format);
        sf.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sf, true));
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
        binder.registerCustomEditor(Short.class, new CustomNumberEditor(Short.class, true));
        binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, true));
        binder.registerCustomEditor(Long.class, new CustomNumberEditor(Long.class, true));
        binder.registerCustomEditor(Float.class, new CustomNumberEditor(Float.class, true));
        binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class, true));
        binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, true));
        binder.registerCustomEditor(BigInteger.class, new CustomNumberEditor(BigInteger.class, true));
        if (this.directFieldAccess) {
            binder.initDirectFieldAccess();
        }
        if (this.messageCodesResolver != null) {
            binder.setMessageCodesResolver(this.messageCodesResolver);
        }
        if (this.bindingErrorProcessor != null) {
            binder.setBindingErrorProcessor(this.bindingErrorProcessor);
        }
        if ((this.validator != null) && (binder.getTarget() != null) &&
                (this.validator.supports(binder.getTarget().getClass()))) {
            binder.setValidator(this.validator);
        }
        if (this.conversionService != null) {
            binder.setConversionService(this.conversionService);
        }
        if (this.propertyEditorRegistrars != null)
            for (PropertyEditorRegistrar propertyEditorRegistrar : this.propertyEditorRegistrars)
                propertyEditorRegistrar.registerCustomEditors(binder);
    }

    public void setFormat(String format) {
        this.format = format;
    }
}

      (2)xml配置

	<bean id="handlerAdapter"  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">	
		<property name="messageConverters">
			<list>
				<bean class="org.nercita.core.web.springmvc.StringHttpMessageConverter" />
				<ref bean="msgConverter"/>
			</list>
		</property>
		<property name="webBindingInitializer">
			<bean class="org.nercita.core.web.springmvc.CustomBindInitializer">		   
				 
				<property name="validator" ref="validator" />
				<property name="conversionService" ref="conversionService" /> 
			</bean> 
		</property>
	</bean>	



 

 

 

 

 

 

 

 

 

 

 

 

 

0
0
查看评论

spring mvc 表单的实体包含时间Date,double等类型的处理

在SpringMVC中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定。 解决的办法就是使用spring mvc提供的@InitBinder标签 在我的项目中是在BaseController中增加方法initBinder,...
  • dxswzj
  • dxswzj
  • 2015-03-05 11:05
  • 2376

SpringMVC利用Column 注解约束double类型的精度

最近做了一个小系统,主要是和.net开发的客户端交互一些数据,采用springmvc框架做的,数据库采用的是mysql,另外为了方面使用了注解方式,省掉了许多配置文件。数据库持久化采用的是hibernate,也采用了注解,相比以往要的xml文件进行映射,注解方便了不少,但是也遇到一些问题。比如poj...
  • haitunmin
  • haitunmin
  • 2017-03-31 09:41
  • 1406

SpringMVC利用Column 注解约束double/float类型的精度

最近做项目要解决实体类生成数据库double,float类型的字段生成时的精度限制,查了一些资料,最终有效果的如下: @Column(name = "grade", columnDefinition="float(10,2) default '0.00'...
  • zhangqun23
  • zhangqun23
  • 2016-09-25 14:35
  • 2239

Spring MVC 自学杂记(二) -- 数据绑定之日期转换

Spring MVC数据绑定之日期转换在Spring MVC中 具备强大的数据绑定,常用的数据类型都是可以直接在后台转换的常见的数据绑定注解有:1.@RequestParam,绑定单个请求数据,可以是URL中的数据,表单提交的数据或上传的文件; 2.@PathVariable,绑定URL模板变量...
  • mybook201314
  • mybook201314
  • 2017-01-08 10:42
  • 1380

SpringMVC配置全局日期转换器,处理日期转换异常

spring3.0配置日期转换可以通过配置自定义实现WebBingingInitializer接口的一个日期转换类来实现,方法如下 转换类: public class DateConverter implements WebBindingIniti...
  • chenleixing
  • chenleixing
  • 2015-04-20 22:11
  • 25832

springMVC 日期字符串统一转换为 date 对象

springMVC 日期字符串统一转换
  • tengdazhang770960436
  • tengdazhang770960436
  • 2017-03-01 17:29
  • 1435

springMVC4(9)属性编辑器剖析入参类型转换原理

我们通过Http请求提交的参数都以字符串的形式呈现,但最终在springMVC的方法入参中,我们却能得到各种类型的数据,包括Number、Boolean、复杂对象类型、集合类型、Map类型等,这些都是springMVC内置的数据类型转换器帮我们完成的。springMVC的将请求数据绑定到方法入参的流...
  • qwe6112071
  • qwe6112071
  • 2016-04-03 12:16
  • 2782

springMVC之对象中的基本类型数据绑定遇到的问题

最进在开发关于SpringMVC框架的项目时,发现个数据绑定的问题,如果这个实体对象里的字段类型为long、int、double时, 解决方案:将long 、int、double改为Long、Integer、Double包装类型即可
  • zkn_CS_DN_2013
  • zkn_CS_DN_2013
  • 2015-09-01 09:32
  • 1387

springBoot接收date类型参数转换

在实体类中,接收的参数类型如果是Date,但前端传的只能是String,该如何转换, 在启动类加@Bean public Converter<String, Date> addNewConvert() { return new Converter<Stri...
  • Kincym
  • Kincym
  • 2017-08-21 15:42
  • 3056

springmvc入门基础之注解和参数传递

SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)和模型(Model),返...
  • hmy1106
  • hmy1106
  • 2016-06-15 18:19
  • 2340
    个人资料
    • 访问:1634013次
    • 积分:18305
    • 等级:
    • 排名:第614名
    • 原创:155篇
    • 转载:913篇
    • 译文:34篇
    • 评论:222条
    文章分类
    最新评论