spring中的类型转换方式,Formatter和Converter

本文原文链接

在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需要复写两个方法,分别是parseprintparse将字符串转换为对象,print将对象转换为字符串

写一个控制器来测试转换器:

@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接口进行类型转换,举个简单的StringInteger的例子,实现方式和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);
            }
        };
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值