Spring Boot集成Spring Security启动失败:CGLIB类包不一致错误
核心问题分析
报错$javax.servlet.GenericFilter$$FastClassBySpringCGLIB$$7c2c92ce not in same package as lookup class的本质是:
CGLIB生成代理类时,要求生成的FastClass必须与目标类处于同一包下,但javax.servlet.GenericFilter属于系统提供的受保护包,应用代码没有权限在该包下创建新类。当自定义JwtAuthenticationFilter继承GenericFilter并被Spring Security通过CGLIB代理时,就会触发这个代码生成异常,直接导致嵌入式Tomcat启动失败;同时因为启动流程中断,Hikari连接池的初始化线程无法正常回收,进而出现线程泄漏警告。
解决方案
1. 切换为JDK动态代理
修改Spring AOP的代理模式,放弃CGLIB改用JDK动态代理(基于接口):
- 若使用方法级安全注解(如
@PreAuthorize),在配置类上添加:@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = false) - 或者在配置文件中全局设置:
注:# application.properties spring.aop.proxy-target-class=falseGenericFilter实现了Filter接口,完全兼容JDK动态代理。
2. 调整自定义Filter的继承类
避免直接继承javax.servlet.GenericFilter,改为继承Spring提供的OncePerRequestFilter(该类位于org.springframework.web.filter包,属于应用可代理范围):
public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 你的JWT校验、认证逻辑 filterChain.doFilter(request, response); } }
3. 排查依赖冲突
检查项目依赖树,确保javax.servlet-api、Spring Security与Spring Boot 2.3.4.RELEASE版本匹配:
- Maven用户执行:
mvn dependency:tree - Gradle用户执行:
gradle dependencies
排除重复或版本不兼容的依赖,比如确保Spring Security版本为5.3.x(与Spring Boot 2.3.x对应)。
4. 解决Hikari线程泄漏警告
该警告是启动失败的衍生问题,只要修复CGLIB代理异常、Tomcat正常启动后,Hikari的初始化线程会被自动回收,警告会消失。若问题解决后仍存在警告,可调整Hikari配置参数(如connectionTimeout、initializationFailTimeout)。
内容的提问来源于stack exchange,提问作者Rohan Chawla

