项目老接口中日期参数是通过@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);
}
//其他属性