Spring Boot WebMvcConfigurerAdapter 方法已经过时解决方法
实现 WebMvcConfigurer 接口
在 Spring Boot 2.0 以后 WebMvcConfigurerAdapter 这个方法已经过时,通过百度网上的资料之后发现很多人说是改成继承 WebMvcConfigurationSupport 这个类,这种方式是有问题的,会导致自动配置失效,应该是实现 WebMvcConfigurer 这个接口。
@Configurationpublic class MyWebConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/orange").setViewName("success");}}
为什么是实现 WebMvcConfigurer 接口而不是实现这个类 WebMvcConfigurerAdapter,通过查看 WebMvcAutoConfiguration 源码, Spring Boot的 Spring MVC 的自动配置类发现,如果实现这个类会导致自动配置失效。
@Configuration@ConditionalOnWebApplication(type = Type.SERVLET)@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,ValidationAutoConfiguration.class })public class WebMvcAutoConfiguration {//...}
配置时间格式化不生效
在 application.properties 进行如下配置:
#日期格式化spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8spring.jackson.serialization.write-dates-as-timestamps=false
注:
- 第1行设置格式
- 第2行设置时区
- 第3行表示不返回时间戳,如果为 true 返回时间戳,如果这三行同时存在,以第3行为准即返回时间戳
但是,网上很多人照着做了还是有问题,照样不能格式化,为嘛?
这里大家注意,看看自己的代码有没有因为添加拦截器而创建了一个配置类,该类继承了 WebMvcConfigurationSupport,就是他!以前是用 WebMvcConfigurerAdapter,springboot 2.0 建议使用 WebMvcConfigurationSupport 。但是在添加拦截器并继承 WebMvcConfigurationSupport 后会覆盖 @EnableAutoConfiguration 关于 WebMvcAutoConfiguration 的配置!从而导致所有的 Date 返回都变成时间戳!
可以采用另外一种方式,在你继承 WebMvcConfigurationSupport 的子类中添加日期转换的 bean
@Configurationpublic class Configurer extends WebMvcConfigurationSupport{@AutowiredHttpInterceptor httpInterceptor;//定义时间格式转换器@Beanpublic MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();ObjectMapper mapper = new ObjectMapper();mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));converter.setObjectMapper(mapper);return converter;}//添加转换器@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {//将我们定义的时间格式转换器添加到转换器列表中,//这样jackson格式化时候但凡遇到Date类型就会转换成我们定义的格式converters.add(jackson2HttpMessageConverter());}@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// TODO Auto-generated method stubregistry.addInterceptor(httpInterceptor).addPathPatterns("/**");super.addInterceptors(registry);}}
或者可以实现 WebMvcConfigurer 接口
@Configurationpublic class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH").allowCredentials(true).maxAge(3600);}}
本文内容来自:
评论