SpringBoot>23 - 2.0版本WebMvc配置

本文详细介绍了如何在SpringBoot 2.0中进行WebMVC的自定义配置,包括拦截器和消息转换器的设置。在2.0版本中,WebMvcConfigurerAdapter已被废弃,推荐使用WebMvcConfigurer接口或继承WebMvcConfigurationSupport类。文章提供了具体的配置示例,并解决了fastjson消息转换器配置失效的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

Springboot的starter封装了很多东西,包含了MessageConverter、ViewResolver等web的配置,若需要自定义。在之前1.5版本中自定义javaBean继承WebMvcConfigurerAdapter类,但是在2.0版本中此类标记过时,需要实现WebMvcConfigurer接口实现自定义配置。

个人学习总结:
链接:【springboot、springcloud、docker 等,学习目录

一、1.5.X版本回顾:

配置类继承WebMvcConfigurerAdapter,重写方法。

/**
 * WebMvcConfigurerAdapter(抽象类):
 * 实现了WebMvcConfigurer接口
 * 自定义web配置,只需重写方法即可
 */
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
    ...
}

// 实现 WebMvcConfigurer 接口
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
    // 方法没有任何逻辑
    public WebMvcConfigurerAdapter() {
    }
    ...
}

// WebMvcConfigurer 接口
public interface WebMvcConfigurer {
    void configurePathMatch(PathMatchConfigurer var1);
    ...
}

设计技巧: 自定义web配置和WebMvcConfigurer接口之间加上抽象类WebMvcConfigurerAdapter ,该抽象类中没有抽象方法(子类必须重写抽象类中的抽象方法),为方法的空实现。继承抽象类之后就不必要去实现那些我们不需要的方法,自定义配置只需要针对某一个方法重写即可。

2.0.X版本WebMVC自定义配置:

SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapter已被废弃 。推荐直接实现WebMvcConfigurer接口或继承WebMvcConfigurationSupport类。

方式1、继承WebMvcConfigurationSupport类:

public class CustomWebMvcConfig extends WebMvcConfigurationSupport{
    ...
}

此种方式会导致web自动配置失效。
原因:查看源码
在这里插入图片描述

// 没有WebMvcConfigurationSupport类型的bean时改自动配置类才会生效
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})

解决:重写相应的方法。例如:

@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(LoginInterceptor()).addPathPatterns("/sys/**")
                .excludePathPatterns("/sys/login.html", "/sys/login/**");
        super.addInterceptors(registry);
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }
}

不推荐此种方式。

方式2、实现 WebMvcConfigurer 接口:
推荐此种配置方式。

1、如下:以拦截器和消息转换器的配置为例

/**
 * @Auther: xf
 * @Date: 2019/1/8 19:25
 * @Description: springboot 2.0  自定义webmvc的配置
 * 方式:
 * 1、继承 WebMvcConfigurationSupport 会导致 webmvc 自动配置失效
 * 2、实现 WebMvcConfigurer 接口  推荐
 */
@Configuration
//public class CustomWebMvcConfig extends WebMvcConfigurationSupport{
public class CustomWebMvcConfig implements WebMvcConfigurer {

    /**
     * 拦截器配置
     * addPathPatterns 用于添加拦截规则
     * excludePathPatterns 用户排除拦截
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
         // 多个拦截器会组成一个拦截器链
         registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**").excludePathPatterns("/login");
         registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
    }

    /**
     * 消息转换器 -- alibaba 开源的 fastjson
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        /**
         * springboot 2.0 配置FastJson失效,添加如下配置
         *
         * 自定义的 FastJsonHttpMessageConverter 在 MappingJackson2HttpMessageConverter 后面,导致失效
         * 解决:加载FastJsonHttpMessageConverter 前删除 MappingJackson2HttpMessageConverter
         *
         * 参考链接:https://segmentfault.com/a/1190000015975405
         */
        Iterator<HttpMessageConverter<?>> iterator = converters.iterator();
        while(iterator.hasNext()){
            HttpMessageConverter<?> converter = iterator.next();
            if(converter instanceof MappingJackson2HttpMessageConverter){
                iterator.remove();
            }
        }

        // 1、需要定义一个convert转换消息的对象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        // 2、添加fastJson的配置信息,比如:是否要格式化返回的json数据;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                // list null -> []
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteDateUseDateFormat,
                // String null -> ""
                SerializerFeature.WriteNullStringAsEmpty,
                // Number null -> 0
                SerializerFeature.WriteNullNumberAsZero,
                // Boolean null -> false
                SerializerFeature.WriteNullBooleanAsFalse,
                //禁止循环引用
                SerializerFeature.DisableCircularReferenceDetect
        );

        // 3、处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        // 4、在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        // 5、将convert添加到converters当中.
        converters.add(fastJsonHttpMessageConverter);

        /**
         * WriteNullListAsEmpty  :List字段如果为null,输出为[],而非null
         * WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
         * DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
         * WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
         * WriteMapNullValue:是否输出值为null的字段,默认为false
         */
    }
}

注意: springboot2.0中fastjson消息转换器配置失效的问题。

2、测试:拦截器、消息转换器均有效。

个人微信公众号,谢谢支持!
在这里插入图片描述

<think>好的,我现在需要帮助用户解决在Spring Boot 3中集成springdoc-openapi-starter-webmvc-ui的问题。首先,用户之前的问题已经提到了他们从Swagger迁移到SpringDoc,因为Spring Boot 3不再支持SpringFox。所以,我需要确保给出的步骤适用于Spring Boot 3.x版本。 首先,我应该确认依赖的版本是否正确。用户提供的引用中提到了版本2.1.0,但可能现在有更新的版本。不过,根据SpringDoc的官方文档,对于Spring Boot 3,应该使用至少2.x版本,而2.1.0可能已经适配。不过最好检查最新的稳定版,比如目前最新的可能是2.2.0,所以需要建议用户查看最新版本,但示例中使用用户提到的2.1.0以避免混淆。 接下来,添加依赖到pom.xml。用户引用的依赖包括webmvc-ui和webmvc-api,但实际上可能只需要webmvc-ui,因为starter通常已经包含必要的API依赖。需要确认是否正确,可能需要简化依赖,只添加webmvc-ui。 然后是配置步骤,是否需要application.properties或application.yml的配置?通常SpringDoc会自动配置,但用户可以自定义些参数,比如文档标题、版本等。需要提供常见的配置示例,比如设置文档信息、启用Swagger UI等。 编写Controller后,如何验证?需要说明访问的URL,比如http://localhost:8080/swagger-ui.html,或者根据配置可能有所变化。此外,可能需要提到使用@OpenAPIDefinition和@Operation等注解来增强API文档。 另外,用户可能需要示例代码,比如个简单的Controller类,带有Swagger注解,以展示如何生成文档。需要确保代码符合Spring Boot 3和SpringDoc的语法,比如使用Jakarta EE的包路径(javax迁移到jakarta)。 还需要注意可能的常见问题,比如依赖冲突,或者版本不兼容。例如,Spring Boot 3使用Jakarta Servlet API,而旧版本SpringDoc可能不支持,因此必须使用兼容的版本。 最后,生成相关问题,可能涉及如何自定义文档、安全配置、如何分组API等。确保问题与集成和配置相关,帮助用户进步探索。 总结步骤:添加正确依赖、配置属性、编写Controller示例、验证访问,并提供常见自定义选项。同时注意版本兼容性和代码示例的正确性。</think>### Spring Boot 3 集成 springdoc-openapi-starter-webmvc-ui 配置教程 #### 1. 添加依赖 在 `pom.xml` 中添加以下依赖(**需使用适配Spring Boot 3的版本**): ```xml <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.1.0</version> <!-- 确保版本兼容Spring Boot 3 --> </dependency> ``` > **说明**: > - `springdoc-openapi-starter-webmvc-ui` 包含UI界面和核心功能[^1] > - 无需单独引入 `webmvc-api`,`webmvc-ui` 已包含必要依赖 --- #### 2. 基础配置(可选) 在 `application.properties` 中添加自定义配置: ```properties # 启用Swagger文档 springdoc.api-docs.enabled=true # 设置文档标题和版本 springdoc.swagger-ui.path=/swagger-ui.html springdoc.swagger-ui.tagsSorter=alpha springdoc.info.title=Spring Boot 3 API文档 springdoc.info.version=1.0.0 ``` --- #### 3. 编写Controller示例 ```java import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Tag(name = "示例API", description = "用户管理接口") public class DemoController { @GetMapping("/hello") @Operation(summary = "测试接口", description = "返回欢迎信息") public String hello() { return "Hello SpringDoc!"; } } ``` > **注解说明**: > - `@Tag` 定义API模块分类 > - `@Operation` 描述接口功能 --- #### 4. 验证访问 启动应用后访问以下URL: - **API文档JSON**:`http://localhost:8080/v3/api-docs` - **Swagger UI界面**:`http://localhost:8080/swagger-ui.html` --- #### 5. 高级配置(可选) 通过Java Config自定义OpenAPI信息: ```java import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenApiConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info() .title("Spring Boot 3 API") .version("2.0") .description("集成SpringDoc示例")); } } ``` --- ### 注意事项 1. **版本兼容性**:Spring Boot 3.x需使用SpringDoc 2.x版本 2. **注解迁移**:原Swagger注解(如`@Api`)需替换为SpringDoc的`@Tag`、`@Operation` 3. **安全拦截**:若项目配置了安全拦截,需放行以下路径: ```properties spring.security.ignored=/swagger-ui/**,/v3/api-docs/**,/webjars/** ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值