记录SpringBoot2.7.5升级SpringBoot3.0.0问题

项目场景:

尝试将自己的项目升级到SpringBoot3.0.0分享下踩过的坑

问题一:启动报错 javax.servlet.http.HttpServletRequest

依赖配置好后,项目启动报错 报错内容如下:


java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present
	at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117) ~[na:na]
	at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125) ~[na:na]
	at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[na:na]
	at java.base/sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68) ~[na:na]
	at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138) ~[na:na]
	at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[na:na]
	at java.base/sun.reflect.generics.repository.ClassRepository.computeSuperInterfaces(ClassRepository.java:117) ~[na:na]
	at java.base/sun.reflect.generics.repository.ClassRepository.getSuperInterfaces(ClassRepository.java:95) ~[na:na]
	at java.base/java.lang.Class.getGenericInterfaces(Class.java:1211) ~[na:na]
	at org.springframework.core.ResolvableType.getInterfaces(ResolvableType.java:500) ~[spring-core-6.0.2.jar:6.0.2]
	at org.springframework.core.ResolvableType.as(ResolvableType.java:448) ~[spring-core-6.0.2.jar:6.0.2]
	at org.springframework.core.ResolvableType.forClass(ResolvableType.java:1048) ~[spring-core-6.0.2.jar:6.0.2]
	at org.springframework.plugin.core.config.PluginRegistriesBeanDefinitionRegistrar.getTargetType(PluginRegistriesBeanDefinitionRegistrar.java:101) ~[spring-plugin-core-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.plugin.core.config.PluginRegistriesBeanDefinitionRegistrar.registerBeanDefinitions(PluginRegistriesBeanDefinitionRegistrar.java:71) ~[spring-plugin-core-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:373) ~[spring-context-6.0.2.jar:6.0.2]
	at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) ~[na:na]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:372) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:409) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:283) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:115) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:745) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:565) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) ~[spring-boot-3.0.0.jar:3.0.0]
	at com.test.test.TestFundApplication.main(TestFundApplication.java:14) ~[classes/:na]
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
	at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
	at java.base/java.lang.Class.forName(Class.java:467) ~[na:na]
	at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) ~[na:na]
	... 32 common frames omitted

原因分析:

发现是因为swagger版本问题,由于swagger需要springfox依赖,但是springfox版本过低
参考连接:How to run with spring boot 3.0.0-snapshot?


解决方案:

替换swagger为springdoc

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.0.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>swagger-ui</artifactId>
                    <groupId>org.webjars</groupId>
                </exclusion>
            </exclusions>
        </dependency>

相关配置 参考SpringBoot结合SpringDoc

问题二: 启动报错 Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

问题一解决后继续报错

原因分析

mybatis和mybatis-plus现在仍然不支持SpringBoot 3.0.0

解决方案

参考:SpringBoot3整合MyBatis报错

问题三: 新版SpringSecurity配置失效

前两个问题解决后顺利启动,访问swagger.html发现请求被拦截,但是我将swagger地址配置了白名单,代码如下:

package com.dsbj.dsbjfund.security.config;

import com.dsbj.dsbjfund.security.component.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;



@Configuration
public class SecurityConfig {

    @Autowired
    private IgnoreUrlsConfig ignoreUrlsConfig;
    @Autowired
    private RestfulAccessDeniedHandler restfulAccessDeniedHandler;
    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
    @Autowired
    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;


    @Bean
    SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry = httpSecurity.authorizeHttpRequests();
        //不需要保护的资源路径允许访问
        for (String url : ignoreUrlsConfig.getUrls()) {
            registry.requestMatchers(url).permitAll();
        }
        //允许跨域请求的OPTIONS请求
        registry.requestMatchers(HttpMethod.OPTIONS)
                .permitAll();
        // 任何请求需要身份认证
        registry.and()
                .authorizeHttpRequests()
                .anyRequest()
                .authenticated()
                // 关闭跨站请求防护及不使用session
                .and()
                .csrf()
                .disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                // 自定义权限拒绝处理类
                .and()
                .exceptionHandling()
                .accessDeniedHandler(restfulAccessDeniedHandler)
                .authenticationEntryPoint(restAuthenticationEntryPoint)
                // 自定义权限拦截器JWT过滤器
                .and()
                .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

        return httpSecurity.build();
    }
}

暂未解决

<think>好的,我现在需要回答用户关于Swagger2SpringBoot不同版本之间的兼容性关系的问题。首先,我得先理清用户提供的引用内容,看看里面有哪些有用的信息。 用户提供了五个引用,其中提到不同版本的SpringBoot与Swagger的兼容性问题。例如,引用[2]提到SpringBoot 2.7.5存在兼容问题,需要降级到2.5.6,并配置`spring.mvc.pathmatch.matching-strategy=ant_path_matcher`。引用[3]指出SpringBoot 2.7以下可以使用Swagger2 2.9.2。引用[4]提到SpringBoot 3.0以上需要同样的配置。引用[5]则涉及SpringBoot 2.7.14尝试使用Swagger 3.0.0的情况。 接下来,我需要整理这些信息,找出常见的版本对应关系。比如,SpringBoot 2.5.x及以下可能兼容Swagger2 2.9.x;而SpringBoot 2.6.x及以上可能需要额外的配置或者降级。对于SpringBoot 3.x以上,可能因为Spring框架的变化,需要不同的处理方式,比如使用SpringDoc替代。 然后,我需要考虑用户可能遇到的问题,比如高版本SpringBoot与Swagger2的不兼容,这时候可能需要调整配置或者更换依赖。同时,用户可能想知道具体的版本对应表,以及解决方案,比如使用SpringDoc作为替代方案。 还需要注意用户提供的引用中有提到不同的配置方法,比如设置`ant_path_matcher`来避免路径匹配问题。这可能是一个常见的解决方案,适用于SpringBoot 2.6.x及以上版本。 最后,生成相关问题时要覆盖常见的疑问,比如如何解决兼容性问题,替代方案,配置方法等。</think>### Swagger2SpringBoot版本兼容性关系总结 #### 一、核心版本对应关系 1. **SpringBoot2.5.x** - 兼容 **Swagger2 (springfox) 2.9.x** - 示例配置: ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> ``` 2. **SpringBoot 2.6.x - 2.7.x** - 需要添加**路径匹配策略配置**(高版本路径解析策略变化导致Swagger失效): ```properties spring.mvc.pathmatch.matching-strategy=ant_path_matcher ``` - 若仍不兼容,可降级SpringBoot2.5.x[^2][^5] 3. **SpringBoot3.0.0** - **不再兼容Swagger2**,需使用替代方案 **SpringDoc OpenAPI**(基于Swagger3)[^4] --- #### 二、典型问题与解决方案 - **问题1:高版本SpringBoot启动报错** **现象**:SpringBoot 2.6.x及以上启动时提示`IllegalArgumentException` **解决**:在`application.properties`中添加路径匹配策略[^2] - **问题2:Swagger页面无法访问** **原因**:SpringBoot 3.x移除了对Springfox的支持 **解决**:改用SpringDoc依赖: ```xml <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.2.0</version> </dependency> ``` --- #### 三、推荐实践 1. **SpringBoot 2.5.x及以下**:直接使用Swagger2 2.9.x 2. **SpringBoot 2.6.x及以上**: - 添加路径匹配配置 - 或升级Swagger依赖至3.0.x(需验证兼容性)[^5] 3. **SpringBoot 3.x**:必须使用SpringDoc(访问路径变为`/swagger-ui.html`) ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值