??????????????? SpringMVC配置全局日期转换器,处理日期转换异常 " />
当前位置: 代码迷 >> VC/MFC >> ??????????????? SpringMVC配置全局日期转换器,处理日期转换异常
  详细解决方案

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

热度:182   发布时间:2016-05-02 03:36:36.0
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.注册ConfigurableWebBindingInitializerRequestMappingHandlerAdapter
       <!-- 注册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>

?

  相关解决方案