SpringMVC DateTimeFormat和Converter冲突问题

在项目中,为统一新接口日期参数为时间戳,添加了日期转换类,导致原有@DateTimeFormat注解失效。分析发现,Converter<String, Date>的存在使得所有日期参数优先使用该转换器而非DateTimeFormatAnnotationFormatterFactory。由于Converter的注册顺序问题,无法通过配置解决冲突,故需要修改Converter类以兼容@DateTimeFormat的日期格式。最后提供了解决冲突的日期转换工具代码。" 127124716,643027,FFmpeg SRT 拉流与推流测试,"['流媒体协议', 'FFmpeg', 'SRT']
摘要由CSDN通过智能技术生成

项目老接口中日期参数是通过@DateTimeFormat接收并格式化的,而且多有种日期格式,为了统一管理,准备将新接口日期参数统一为时间戳。添加时间戳日期转换类后,发现之前接口的@DateTimeFormat都失效了,为了兼容老接口,只能查看源码对有无@DateTimeFormat的日期类型分别怎样处理。

结果发现,当参数解析需要类型转换时,会先查询转换器,并检查转换器是否匹配,然后通过转换器做类型转换。

当没有加入Converter<String, Date>时,带有@DateTimeFormat注解的日期参数会得到DateTimeFormatAnnotationFormatterFactory作为转换器工厂,实现类型转换。没有@DateTimeFormat注解的日期参数会得到ObjectToObjectConverter作为转换器实现类型转换。

当加入Converter<String, Date>后,所有的日期参数都会优先获得这个转换器,因此导致@DateTimeFormat注解失效。

在添加类型转换工具时,会将新加入的Bean放在存储链表的前面,保证比默认转换器优先找到。相关代码如下

// GenericConversionService的内部类
private static class ConvertersForPair {
   
		// 存储类型转换工具的List
		private final LinkedList<GenericConverter> converters = new LinkedList<>();
		
		public void add(GenericConverter converter) {
   
			this.converters.addFirst(converter);
		}
		//其他属性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值