SpringMVC中的ConversionSerivce的作用是把接收的参数以什么“类型”呈现出来。前端传递什么参数我们后台以什么形势接收它们。比如SpringMVC中前端1,我们可以把它当成String或int,使用ConversionSerivce重点是类型,只要在类型不是常用类型的情况下才会调用我们自定义的参数转换器转换参数类型。
第一步:自定义参数类型转换器
注意,只有在参数类型是这个类型时候才会调用该转换器,后面还详细解
import java.sql.Timestamp;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.convert.converter.Converter;
import yui.comn.util.DateUtils;
public class TimestampConverter implements Converter<String, Timestamp> {
@Override
public Timestamp convert(String timeStr) {
Timestamp t = null;
timeStr = timeStr.replace("T", " ");
if (StringUtils.isNotBlank(timeStr)) {
try {
t = DateUtils.covertStrToTimestamp(timeStr, "yyyy-MM-dd HH:mm:ss");
} catch (Exception e) {
t = new Timestamp(new Date().getTime());
e.printStackTrace();
}
}
return t;
}
}
第二步:配置despatcher-servlet.xml:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="yui.bss.comn.convert.TimestampConverter"></bean>
</set>
</property>
</bean>
在mvc:annotation-driven标签里使用conversion-service属性引用我们自定义的参数转换器
第三步:在springMVC接口里使用该转换
上面自定义的转换器是将字符串转换成Timestamp类型,所以只有当传递的参数是字符串且接口里想要的类型是Timestamp是才会调用自定义接口。这里经常有人搞错了,以为每个参数都会经过转换器转换,其实是不对的。
比如如下:
@RequestMapping(value = "/do1", method = RequestMethod.GET)
@ResponseBody
public Object do1(@RequestParam(value="t1") Timestamp t1, @RequestParam(value="t2") String t2) {
try {
//业务逻辑
logger.info(result);
return result;
}catch(Throwable e){
logger.info(e);
}
}
接口里需要2个参数,第一个t1类型是Timestamp,第二个t2是String,当我们访问请求时,只有参数名是t1的数据才会进入自定义参数转换器TimestampConverter,t2是不会进入的。因为需要t1参数以Timestamp类型呈现出现,但接收的类型是字符串,所以需要转换,t2需要String类型呈现,接收到的正常是字符串,所以不需要转换,如果定义成int类型,也不需要我们在自定义参数类型转换器的,因为SpringMVC类型了。
第四:总结
使用ConversionSerivce重点是类型”的概念,需要类型做转换,我们自定义的参数类型转换器的泛型即我们需要的类型。比如
TimestampConverter implements Converter<String, Timestamp>