错误使用@EnableWebMvc带来的配置失效问题

错误使用@EnableWebMvc带来的配置失效问题

@EnableWebMvc带来的一些坑

​ 最近在出于一些原因在项目中使用了@EnableWebMvc这个注解,但没有正确使用,后来发现Java对象中时间类的序列化格式出现了问题,变成了一个数字的list(形如[2022, 12, 21]),前端无法读取导致系统无法正常运行。

​ 通过查看@EnableWebMvc的源码,可以发现该注解就是为了引入一个DelegatingWebMvcConfiguration 配置类,而DelegatingWebMvcConfiguration又继承于WebMvcConfigurationSupport。也就是说,如果我们使用@EnableWebMvc就相当于导入了WebMvcConfigurationSupport类,这个时候,Spring Boot的自动装配就不会发生了,我们能用的,只有WebMvcConfigurationSupport提供的若干个配置。在自动配置类 WebMvcAutoConfiguration 上有条件注解

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

​ 那若是我们需要自己定制一些项目的设置,可以通过以下方式

@EnableWebMvc + extends WebMvcConfigurationAdapter,在扩展的类中重写父类的方法即可,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置

extends WebMvcConfigurationSupport,在扩展的类中重写父类的方法即可,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置

extends WebMvcConfigurationAdapter/WebMvcConfigurer,在扩展的类中重写父类的方法即可,这种方式依旧使用springboot的@EnableAutoConfiguration中的设置

​ 其实官方也说明了

Spring Boot 默认提供Spring MVC 自动配置,不需要使用@EnableWebMvc注解
如果需要配置MVC(拦截器、格式化、视图等)请使用添加@Configuration并实现WebMvcConfigurer接口.不要添加@EnableWebMvc注解。
@EnableWebMvc 只能添加到一个@Configuration配置类上,用于导入Spring Web MVC

​ 所以当我们真的需要修改这些配置类的某些内容,比如说默认主页、序列化格式等,最好以override的方式进行,只对想修改的方法进行覆盖,这样其他方法功能不受影响。

​ 回到项目中,问题出现的原因就在于与序列化相关的类没有被正常加载,只调用了最基本的GET方法。在这种情况下,除了使用正确的方式使用@EnableWebMvc之外,我们还可以自定义新的配置类来加载对象的序列化器,来达到一样的效果。

配置接口的序列化器

@Configuration
public class AWebMvcConfig extends WebMvcConfigurationSupport {
   
	@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
   
        /*
        boolean flag = false;
        for (HttpMessageConverter converter : converters){
            if (converter instanceof FastJsonHttpMessageConverter) {
                flag = true;
                break;
            }
        }
         */

        converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof FastJsonHttpMessageConverter);
        // 需要重新加入jackson的转换器,该处的objectMapper已经在配置中注册了

        ObjectMapper objectMapper = new ObjectMapper();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd 1111 HH-mm-ss");

        objectMapper.setDateFormat(simpleDateFormat);
        converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));

        ObjectMapper objectMapper2 = new ObjectMapper();
        
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: @enablewebmvc注解将会自动配置和引入大量的 Spring WebMvc 组件和特性。如果在使用了@enablewebmvc注解后@import不再生效,可能是因为该注解中已经配置好了需要的组件,因此无需再手动通过@import方式引入。 需要注意的是,@enablewebmvc注解会代替@Configuration和@EnableWebMvc注解,因此如果已经使用了这两个注解,就不需要再添加@enablewebmvc注解了。 ### 回答2: 使用@EnableWebMvc注解后,@Import注解失效的原因是@EnableWebMvc注解本身已经包含了@Import注解的功能。 @EnableWebMvc注解是Spring框架提供的一个类级别的注解,它的作用是开启Spring MVC的相关配置。该注解会自动为我们完成一些常用的配置,例如注册必要的组件和配置默认的处理器。在@EnableWebMvc注解内部,Spring框架已经使用了@Import注解来引入了一些必要的类,这些类包含了Spring MVC框架所需的所有配置。 因此,当我们使用了@EnableWebMvc注解时,已经包含了@Import注解的功能,所以我们不再需要显式地使用@Import注解来导入其他配置类。这也是为什么在使用@EnableWebMvc注解后,@Import注解不再起作用的原因。 总结起来,使用@EnableWebMvc注解后,无需使用@Import注解来导入其他配置类,因为@EnableWebMvc本身已经包含了所有必要的配置。 ### 回答3: 在Spring框架中,@EnableWebMvc注解用于启用Web MVC功能,它会自动为我们进行一些配置,例如处理HTTP请求和响应、渲染视图等。当我们使用@EnableWebMvc注解后,它会自动注册一些默认的配置类,如WebMvcConfigurerAdapter。 而在另一方面,@Import注解用于将指定的配置类导入到当前的配置类中。它可以用于注册额外的配置类,以提供其他的功能。 然而,由于@EnableWebMvc已经自动注册了WebMvcConfigurerAdapter类,它的注册会覆盖在@Import中导入的配置类,因此@Import注解失效了。 解决这个问题的方法是,我们可以直接在WebMvcConfigurerAdapter类中添加我们需要的配置,而不需要使用@Import注解导入其他的配置类。在WebMvcConfigurerAdapter类中,我们可以实现addInterceptors、addCorsMappings和addViewControllers等方法来自定义一个WebMvcConfigurer配置类,提供更多的自定义配置。 总之,在使用@EnableWebMvc注解时,需要注意它已经自动注册了WebMvcConfigurerAdapter类,以提供默认的配置。如果需要更多的自定义配置,可以直接在WebMvcConfigurerAdapter类中进行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值