springboot 2.0 mvc配置接口WebMvcConfigurer

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);
    }
}

过滤器在拦截器之前执行。

有关配置的最后一项,消息内容转换器,在我的另一篇博客有详细说明


点击查看完整代码

记录成长,热爱生活!

你可能感兴趣的:(java)