SpringBoot配置MVC方法

四个MVC配置说明:

  • WebMvcConfigurer 为接口
  • WebMvcConfigurerAdapter 是 WebMvcConfigurer 的实现类大部分为空方法,是 WebMvcConfigurer的子类实现,由于Java8中可以使用default关键字为接口添加默认方法,为在源代码中spring5.0之后就已经弃用本类,如果需要我接着可以实现WebMvcConfigurer类。
  • WebMvcConfigurationSupport 是mvc的基本实现并包含了WebMvcConfigurer接口中的方法。
  • WebMvcAutoConfiguration 是mvc的自动装在类并部分包含了WebMvcConfigurer接口中的方法。

重写WebMvcConfigurationSupport后SpringBoot自动配置失效

所以一般不推荐重写WebMvcConfigurationSupport类进行配置

MVC配置方式:

  • 使用@EnableWebMvc注解配置
    SpringBoot配置MVC方法_第1张图片
  • 继承WebMvcConfigurationSupport
  • 继承 DelegatingWebMvcConfiguration 是WebMvcConfigurationSupport的拓展子类,如果项目中也存在其他实现WebMvcConfigurer接口来提供配置的类,则可以继承DelegatingWebMvcConfiguration来替代@EnableWebMvc,两者提供的功能是一样的。

其中用的比较多的是一下三个接口:

    /** 解决跨域问题 **/
    public void addCorsMappings(CorsRegistry registry) ;
    
    /** 添加拦截器 **/
    void addInterceptors(InterceptorRegistry registry);
    
    /** 静态资源处理 **/
    void addResourceHandlers(ResourceHandlerRegistry registry);

实例:

@Configuration
public class CommunityWebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    ObjectMapper mapper;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TraceInterceptor());
        super.addInterceptors(registry);
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(this.mappingJackson2HttpMessageConverter());
        super.configureMessageConverters(converters);
    }

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        SimpleModule module = new SimpleModule();
        module.addDeserializer(IPage.class, new IPageDeserializer(IPage.class));
        mapper.registerModule(module);

        converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8, MediaType.APPLICATION_OCTET_STREAM));
        converter.setObjectMapper(mapper);

        return converter;
    }

    /**
     * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations(
                "classpath:/static/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
                "classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
        super.addResourceHandlers(registry);
    }
}

MappingJackson2HttpMessageConverter(消息转换器)借助的是Jackson来完成序列化,那么若是可以修改Jackson的配置,便可自定义输出响应内容。
对于Date或者LocalDateTime类型,我们希望按照yyyy-MM-dd HH:mm:ss格式输出。SpringBoot默认装载了ObjectMapper到Spring容器,在yml配置文件中使用spring.jackson为前缀的配置可以修改,也可以在代码中实现Jackson2ObjectMapperBuilderCustomizer接口去修改ObjectMapper配置。
对于时间格式:

    @Bean
    @ConditionalOnMissingBean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            builder.locale(Locale.CHINA);
            builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
            builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
            builder.modules(new MyJavaTimeModule());
        };
    }


public class MyJavaTimeModule extends SimpleModule {
    public MyTimeModule() {
        super(PackageVersion.VERSION);
        this.addSerializer(LocalDateTime.class,
                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
        this.addSerializer(LocalDate.class,
                new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
        this.addSerializer(LocalTime.class,
                new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
        this.addDeserializer(LocalDateTime.class,
                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
        this.addDeserializer(LocalDate.class,
                new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
        this.addDeserializer(LocalTime.class,
                new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
    }
}

你可能感兴趣的:(spring,boot,java,spring,cloud)