在web应用中实现类型转换的两种方式
一:实现org.springframework.format.datetime.DateFormatter
接口,对于一个常见的字符串转日期的Formatter
可有如下实现:
@Configuration
public class CommonConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(dateFormatter());
}
private Formatter<Date> dateFormatter(){
return new Formatter<Date>() {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
@Override
public Date parse(String text, Locale locale) throws ParseException {
if(text.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}")){
return simpleDateFormat.parse(text);
}
String errMsg = "错误的日期格式{"+text+"},要求格式{yyyy-MM-dd HH:mm}";
throw new IllegalArgumentException(errMsg);
}
@Override
public String print(Date date, Locale locale) {
return simpleDateFormat.format(date);
}
};
};
}
在上面例子中,需要注意的是:
- 配置类需要实现
WebMvcConfigure
接口,并复写addFormatters
方法,将自己的Formatter
注册进去- 实现
Formatter
需要复写两个方法,分别是parse
和parse
将字符串转换为对象,
写一个控制器来测试转换器:
@Controller
@RequestMapping("/test")
public class TestController{
@GetMapping("/str2Date")
@ResponseBody
public Date str2Date(Date date){
return date;
}
}
访问http://localhost/test/str2Date?date=2019-12-13%2023:22
,浏览器输出2019-12-13 23:22
访问http://localhost/test/str2Date?date=2019-12-13
,后台报错错误的日期格式{2019-12-13},要求格式{yyyy-MM-dd HH:mm}
可以看出,浏览器中输入的参数date
为字符串格式,后台接收时是用的Date
,我们自定义的Formatter
对这两种类型进行了转换
二:实现Converter
接口进行类型转换,举个简单的String
转Integer
的例子,实现方式和Formatter
差不多,不再详细说明
@Configuration
public class CommonConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(stringIntegerConverter());
}
private Converter<String,Integer> stringIntegerConverter(){
return new Converter<String, Integer>() {
@Override
public Integer convert(String source) {
return Integer.valueOf(source);
}
};
}
}