• springmvc参数类型转换三种方式


    SpringMVC绑定参数之类型转换有三种方式:

        1. 实体类中加日期格式化注解 

       

    @DateTimeFormat(pattern="yyyy-MM-dd hh:MM")
    private Date creationTime;
        2.在Controller类的方法中加入一段代码
        /**
         * 在controller层中加入一段数据绑定代码
         * @param webDataBinder
         */
        @InitBinder
        public void initBinder(WebDataBinder webDataBinder) throws Exception{
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
            simpleDateFormat.setLenient(false);
            webDataBinder.registerCustomEditor(Date.class , new CustomDateEditor(simpleDateFormat , true));
        }
       备注:自定义类型转换器必须实现PropertyEditor接口或者继承PropertyEditorSupport类
    写一个类 extends propertyEditorSupport(implements PropertyEditor){
         public void setAsText(String text){
             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy -MM-dd hh:mm");
            Date date = simpleDateFormat.parse(text);
            this.setValue(date);
         }
         public String getAsTest(){
          Date date = (Date)this.getValue(); 
          return this.dateFormat.format(date);
         }
    }
       3.(spring 3.0以前使用正常,以后的版本需要使用< mvc:annotation-driven/>注册使用)使用xml配置实现类型转换(系统全局转换器)
       1.注册conversionservice
      
            <!-- 注册ConversionService-->
            <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
                <property name="converters">
                    <set>
                        <bean class="com.ezubo.global.portal.util.StringToDateConverter">
                            <constructor-arg index="0" value="yyyy-MM-dd hh:mm"/>
                        </bean>
                    </set>
                </property>
            </bean>
     备注:StringtoDateConverter.java的实现:
    /**
     * Created by 苏 on 15-10-13.
     */
    public class StringToDateConverter implements Converter<String,Date> {
    
        private static final Logger logger = LoggerFactory.getLogger(StringToDateConverter.class);
    
        private String pattern;
    
        public StringToDateConverter(String pattern){
            this.pattern = pattern;
        }
    
        public Date convert(String s) {
    
            if(StringUtils.isBlank(s)){
                return null;
            }
    
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
            simpleDateFormat.setLenient(false);
            try{
                return simpleDateFormat.parse(s);
            }catch(ParseException e){
                logger.error("转换日期异常:"+e.getMessage() , e);
                throw new IllegalArgumentException("转换日期异常:"+e.getMessage() , e);
            }
        }
    }
    
       2.使用 ConfigurableWebBindingInitializer 注册conversionService
           <!--使用 ConfigurableWebBindingInitializer 注册conversionService-->
           <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
                <property name="conversionService" ref="conversionService"/>
           </bean>
     3.注册ConfigurableWebBindingInitializer到RequestMappingHandlerAdapter
           <!-- 注册ConfigurableWebBindingInitializer 到RequestMappingHandlerAdapter-->
           <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
                <property name="webBindingInitializer" ref="webBindingInitializer"/>
                <!-- 线程安全的访问session-->
                <property name="synchronizeOnSession" value="true"/>
           </bean>
     

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

       4.(spring 3.2以后使用正常)使用<mvc:annotation-driven/>注册conversionService

       具体原因请参考:

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

          1.注册ConversionService

            <!-- 注册ConversionService-->
            <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
                <property name="converters">
                    <set>
                        <bean class="com.ezubo.global.portal.util.StringToDateConverter">
                            <constructor-arg index="0" value="yyyy-MM-dd hh:mm"/>
                        </bean>
                    </set>
                </property>
            </bean>

      2. 需要修改springmvc-servlet xml配置文件中的annotation-driven,增加属性conversion-service指向新增的   conversionService。 

        <mvc:annotation-driven conversion-service="conversionService">
            <mvc:message-converters register-defaults="true">
                <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
                    <!--转换时设置特性-->
                    <property name="features">
                        <array>
                            <!--避免默认的循环引用替换-->
                            <ref bean="DisableCircularReferenceDetect"/>
                            <ref bean="WriteMapNullValue"/>
                            <ref bean="WriteNullStringAsEmpty"/>
                            <ref bean="WriteNullNumberAsZero"/>
                        </array>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
  • 相关阅读:
    Mybatis中#{}与${}的区别:
    JDBC
    JavaScript与jQuery的区别
    JavaScript 高级
    AdminLTE
    servlet过滤器与监听器
    数据库连接池
    大对象数据LOB的应用
    Serializable
    泛型
  • 原文地址:https://www.cnblogs.com/zxf330301/p/5829136.html
Copyright © 2020-2023  润新知