1. 程式人生 > >spring mvc 參數類型轉換

spring mvc 參數類型轉換

() actor servlet date 代碼 pin per www. frame

實現方式以字符串轉Date為例說明:

全局配置

第一種:實現 Converter 接口

  • 實現類:
    public class StringToDateConveter implements Converter {

        private String formatPatten;
    
        public StringToDateConveter(String formatPatten){
            this.formatPatten=formatPatten;
        }
    
        @Override
        public Date convert(String s) {
            return DateUtil.string2Date(s,formatPatten);
        }
    }
    
  • mvc.xml配置

    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
    
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.lannong.api.www.converter.StringToDateConveter">
                    <constructor-arg name="formatPatten" value="yyyy-MM-dd"/>
                </bean>
            </set>
        </property>
    </bean>
    
  • 配置到handlerAdapter

       <!--使用 ConfigurableWebBindingInitializer 註冊conversionService-->
       <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="conversionService" ref="conversionService"/>
       </bean>
    
       <!-- 註冊ConfigurableWebBindingInitializer 到RequestMappingHandlerAdapter-->
       <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="webBindingInitializer" ref="webBindingInitializer"/>
       </bean>
    

第二種:實現Formatter接口,與第一種實現方式類似

  • 實現類

    public class MyDateFormater implements Formatter<Date> {
    
        @Override
        public Date parse(String s, Locale locale) throws ParseException {
            return DateTimeUtil.string2Date(s,"yyyy-MM-dd");
        }
    
        @Override
        public String print(Date date, Locale locale) {
            return null;
        }
    }
    
  • mvc.xml配置

    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
    
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">
            <set>
                <bean class="com.lannong.api.www.converter.MyDateFormater"/>
            </set>
        </property>
    </bean>
    

第三種:實現WebBindingInitializer接口

  • 實現類

    public class MyWebBindingInitializer implements WebBindingInitializer {
    
        @Override
        public void initBinder(WebDataBinder binder, WebRequest request) {
    
            binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
                @Override
                public void setAsText(String text) {
                    setValue(DateTimeUtil.string2Date(text, "yyyy-MM-dd"));
                }
            });
        }
    }
    
  • mvc.xml配置

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="webBindingInitializer">
            <bean class="com.lannong.api.www.binder.MyWebBindingInitializer"/>
        </property>
        <!-- others config -->
    </bean>
    

局部配置

在Controller中添加轉換方法並添加@InitBinder

  • 代碼

    @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));
    }
    
    或
    
    @InitBinder
    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                setValue(DateTimeUtil.string2Date(text, "yyyy-MM-dd"));
            }
        });
    }
    

兩種方式都可以,作用域和該方法作用域一樣

使用@DateTimeFormat(pattern = "yyyy-MM-dd")

註解可以加在屬性上,也可以加在方法上,需要導入joda-time.jar。另外日期參數的格式需要和patten定義的一致,否則會報400錯誤

spring mvc 參數類型轉換