Spring Boot 2.0.0 RC1中如何全局接收LocalDates作为RequestParams?
解决Spring Boot 2.0.0 RC1全局日期格式化问题(无需
@DateTimeFormat) 你提到的那个代码提交变更确实调整了WebConversionService的注册逻辑,直接自定义WebConversionService Bean大概率不会被Spring MVC的上下文正确拾取,这就是你的配置没生效的核心原因。下面给你两种靠谱的全局配置方案,不用加注解就能统一处理日期参数:
方案一:通过WebMvcConfigurer全局注册日期格式化器
这种方式直接给Spring MVC添加全局的日期转换规则,所有请求参数里的日期字符串都会按指定规则解析:
import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.format.datetime.DateFormatter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class GlobalDateConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { // 自定义日期格式,可根据需求调整为你需要的格式 DateFormatter dateFormatter = new DateFormatter("yyyy-MM-dd"); registry.addFormatter(dateFormatter); } }
配置完成后,所有请求中类型为Date的参数,都会用yyyy-MM-dd格式解析,比如2018-01-01就能正常转成Date对象。
方案二:对齐Jackson的JSON日期格式(无需重复配置格式)
如果你希望请求参数的日期解析和JSON序列化/反序列化用完全一致的规则,只需要维护一处配置,可以这么做:
- 先在
application.properties(或application.yml)里配置Jackson的日期格式:
spring.jackson.date-format=yyyy-MM-dd spring.jackson.time-zone=GMT+8
- 然后自定义一个
Converter<String, Date>,复用Spring自动配置好的ObjectMapper来做转换:
import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; import java.util.Date; @Configuration public class GlobalDateConverterConfig { private final ObjectMapper objectMapper; // 注入Spring自动配置的ObjectMapper,已包含你设置的日期格式 public GlobalDateConverterConfig(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Bean public Converter<String, Date> stringToDateConverter() { return source -> { try { // 包装成JSON字符串格式,复用Jackson的解析逻辑 return objectMapper.readValue("\"" + source + "\"", Date.class); } catch (Exception e) { throw new IllegalArgumentException("日期格式无效,请使用yyyy-MM-dd格式", e); } }; } }
这样一来,请求参数的日期解析就和Jackson处理JSON的逻辑完全同步了,你只需要维护Jackson的配置即可,完美实现“无需额外配置就像解析JSON一样工作”的需求。
补充:为什么直接自定义WebConversionService Bean没生效?
在Spring Boot 2.0 RC1的那次变更中,WebMvcAutoConfiguration会自行创建WebConversionService,并且优先使用内部的配置逻辑。直接定义自己的WebConversionService Bean,不会被Spring MVC的上下文正确加载,所以通过WebMvcConfigurer的addFormatters方法或者添加Converter的方式,才是官方推荐的全局配置途径。
内容的提问来源于stack exchange,提问作者Reveloper
相关产品推荐
相关产品推荐

