文章目录
1. WebMvcConfigurationSupport、WebMvcConfigurer 区别
springboot中我们通过继承WebMvcConfigurerAdapter进行springmvc相关的配置,如拦截器、消息转换、视图解析器等。在springboot2.0后,该接口被废弃,官方推荐直接implements WebMvcConfigurer ,或者extends WebMvcConfigurationSupport。
查看源码发现@EnableWebMvc实际上引入了一个继承WebMvcConfigurationSupport的DelegatingWebMvcConfiguration。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport
然后查看WebMvcAutoConfiguration的源码发现:
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({
Servlet.class, DispatcherServlet.class,WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({
DispatcherServletAutoConfiguration.class,ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
...
}
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})意思是如果存在它修饰的类的bean,则不需要再创建这个bean。由此可得出结论:如果有bean继承了DelegatingWebMvcConfiguration,WebMvcConfigurationSupport,或者开启了@EnableWebMvc,那么 @EnableAutoConfiguration 中的WebMvcAutoConfiguration 将不会被自动配置,而是使用自定义的WebMvcConfigurationSupport的配置。
总结
推荐前两种方式
-
implements WebMvcConfigurer : 不会覆盖@EnableAutoConfiguration关于WebMvcAutoConfiguration的配置。
-
extends WebMvcConfigurationSupport :会覆盖@EnableAutoConfiguration关于WebMvcAutoConfiguration的配置。注意:使用WebMvcConfigurationSupport类配置拦截器时一定要重写addResourceHandlers来实现静态资源的映射
-
@EnableWebMvc : 等于扩展了WebMvcConfigurationSupport但是没有重写任何方法。
-
extends WebMvcConfigurerAdapter spring2.0不再建议使用,被废弃。官方推荐直接实现WebMvcConfigurer 。
2. 自定义消息转换器MessageConverters
以下配置代码用于使用LocalDate,LocalTime ,LocalDateTime属性接收前端传来的标准时间字符串,并返回指定的时间格式,LocalDate对应 yyyy-MM-dd
,LocalDateTime对应yyyy-MM-dd HH:mm:dd
,LocalTime对应 HH:mm:dd
,不论参数的形式传递如body、pathVariable、requestParam里,只要时间字符串满足格式要求都可以转为对应的时间日期属性。
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import com.jun.cloud.common.util.DateUtil;
import org.springframework.context