springboot1.x中mvc配置通常是继承WebMvcConfigurerAdapter抽象类,springboot2.x废弃了WebMvcConfigurerAdapter,官方推荐两种方式来实现mvc的配置。
一是继承WebMvcConfigurationSupport,但是继承它以后springboot默认的配置会全部失效,都要在类中重写,太粗暴。二是实现WebMvcConfigurer接口,与springboot原有的默认配置不冲突,推荐。下面是WebMvcConfigurer的简单使用。
直接贴代码:
/**
* MVC配置类
*/
@Configuration
public class MVConfig implements WebMvcConfigurer {
/**
* 添加拦截器
*
* @param registry
*/
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器");
return true;
}
}).addPathPatterns("/**");
}
/**
* 跨域配置。
* 已经配置拦截器的情况下,请求会先到拦截器,还是会有跨域问题
* 建议使用CorsFilter做跨域设置,避免和拦截器冲突
*
* @param registry
*/
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/")
.allowedOrigins("*")
.allowedMethods("POST", "GET")
.allowCredentials(true)
.allowedHeaders("*");
}
/**
* 添加无逻辑试图跳转控制
* 相当于简单的controller返回静态文件
* springboot中,静态资源默认路径是static
*
* @param registry
*/
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
/**
* 配置静态资源路径
* 默认是/static
*
* @param registry
*/
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//默认映射路径
registry.addResourceHandler("/").addResourceLocations("classpath:/static");
//可继续增加...
}
/**
* 自定义视图解析器,也可在配置文件中定义
*
* @param registry
*/
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/views/", ".html");
}
/**
* 自定义消息内容转换器
* 代替@ResponseBody
* 处理自定义MediaType,produces = "application/customjson"的响应报文
* @param converters
*/
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fjhmc = new CustomMessageConverter();
List<MediaType> mediaTypeList = new ArrayList<>();
mediaTypeList.add(MediaType.parseMediaType("application/customjson"));
fjhmc.setSupportedMediaTypes(mediaTypeList);
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
SerializerFeature[] serializerFeatures = new SerializerFeature[]{
// 是否输出为null的字段,若为null 则显示该字段
// SerializerFeature.WriteMapNullValue,
// 数值字段如果为null,则输出为0
SerializerFeature.WriteNullNumberAsZero,
// List字段如果为null,输出为[],而非null
SerializerFeature.WriteNullListAsEmpty,
// 字符类型字段如果为null,输出为"",而非null
SerializerFeature.WriteNullStringAsEmpty,
// Boolean字段如果为null,输出为false,而非null
SerializerFeature.WriteNullBooleanAsFalse,
// 输出map中的null字段
SerializerFeature.WriteMapNullValue,
// Date的日期转换器
SerializerFeature.WriteDateUseDateFormat,
// 循环引用
SerializerFeature.DisableCircularReferenceDetect,
};
fastJsonConfig.setSerializerFeatures(serializerFeatures);
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
fjhmc.setFastJsonConfig(fastJsonConfig);
converters.add(fjhmc);
}
}
基本涵盖了MVC常用的一些配置。
其中Cors跨域配置不建议写在这里,请求会先走拦截器再走跨域设置,因此在配置了拦截器的情况下,前端请求时还会报跨域,推荐使用过滤器解决。
把代码贴出来:
/**
* 跨域过滤器
*/
@Configuration
public class CorsConfig {
private CorsConfiguration corsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setMaxAge(3600L);
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig());
return new CorsFilter(source);
}
}
过滤器在拦截器之前执行。
有关配置的最后一项,消息内容转换器,在我的另一篇博客有详细说明