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>
时间: 2024-10-07 08:08:06

springmvc参数类型转换三种方式的相关文章

估计高斯混合模型参数的三种方式

对于如下的两类别的高斯混合模型 \[ \pi\cdot N(\mu_1,\sigma_1^2)+(1-\pi)\cdot N(\mu_2,\sigma_2^2) \] 参数为\(\theta = (\pi, \mu_1,\mu_2,\sigma_1,\sigma_2)\).至今,我了解到有三种方式来估计这五个参数.这三种方式分别为梯度下降法.EM算法和Gibbs采样,而且这三种算法并非毫不相关.EM算法其实是简化梯度下降法中对于对数似然的计算,而Gibbs采样跟EM算法区别在于前者采样后者求最大

命令行运行Python脚本时传入参数的三种方式

三种常用的方式如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. python script.py 0,1,2 10python script.py -gpus=0,1,2 --batch-size=10python script.py -gpus=0,1,2 --batch_size=10123这三种格式对应不同的参数解析方式,分别为sys.argv, argparse, tf.app.run, 前两者是python自带的功能,后者是ten

Struts2中Action接收参数的三种方式

Struts2中Action接收参数的方法主要有以下三种:1.使用Action的属性接收参数:    a.定义:在Action类中定义属性,创建get和set方法:    b.接收:通过属性接收参数,如:userName:    c.发送:使用属性名传递参数,如:user1!add?userName=zhangsan:2.使用DomainModel接收参数:    a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法:    b.接收

PHP命令行脚本接收传入参数的三种方式

通常PHP都做http方式请求了,可以使用GET or POST方式接收参数,有些时候需要在shell命令下把PHP当作脚本执行,比如定时任务.这就涉及到在shell命令下如何给php传参的问题,通常有三种方式传参. 一.使用$argv or $argc参数接收 <?php /** * 使用 $argc $argv 接受参数 */ echo "接收到{$argc}个参数"; print_r($argv); 以下是测试的结果 二.使用getopt函数(推荐使用这种方法) <?

Nodejs express 获取url参数,post参数的三种方式

Js代码  : express获取参数有三种方法:官网实例: Checks route params (req.params), ex: /user/:id Checks query string params (req.query), ex: ?id=12 Checks urlencoded body params (req.body), ex: id= 1.例如:127.0.0.1:3000/index,这种情况下,我们为了得到index,我们可以通过使用req.params得到,通过这种方

php手记之02-tp5请求参数读取三种方式

01-[推荐方式] 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息.在Thinkphp5.1中,获取请求对象数据,是由think\Request类负责,在很多场合下并不需要实例化调用,通常使用依赖注入即可, $request->param('name'); 02-在其它场合(例如模板输出等)则可以使用think\facade\Request静态类操作. Request::param('name'); 03-辅助函数[推荐2] //获取get的所有参数 input('

myeclipse设置jvm参数的三种方式

方法一: 打开eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面有对勾的JRE,再单击右边的“Edit”按钮, 出现一个 Edit JRE 的对话框,在其中的Default VM Arguments: 框中输入 -Xms128m -Xmx512m ,这样设置Java拟虚机内存使用最小是128M,最大是512M,再单击“OK”关闭 Edit JRE 对话框,再单击“OK”关闭 Preferences对话

HTML中接收URL参数的三种方式

1.使用 window.location.search 来取得后面的参数 // param参数的名 function getParameter(param){var query = window.location.search;var iLen = param.length;var iStart = query.indexOf(param);if (iStart == -1) return "";iStart += iLen + 1;var iEnd = query.indexOf(&

SpringMVC返回json数据的三种方式

SpringMVC返回json数据的三种方式:http://blog.csdn.net/shan9liang/article/details/42181345 上述第三种方法:可能会出现这个jar包没有的情况,引入即可,下面pom引入即可 java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException