Spring Boot WebFlux项目启动报错:Error processing condition on PropertyPlaceholderAutoConfiguration.propertySourcesPlaceholderConfigurer
嘿,这个问题我太熟悉了!你这是不小心混用了Servlet栈和Reactive栈的Spring Security依赖,导致项目启动时找不到Servlet相关的类。
我们来一步步拆解问题:
从报错栈的最底层能看到关键原因:
Caused by: java.lang.ClassNotFoundException: jakarta.servlet.Filter
为什么会找不到这个类?因为你用的是Spring Boot WebFlux(响应式Web框架,属于Reactive栈),但你引入了spring-security-web——这个依赖是给传统Servlet栈的Spring MVC项目用的,它依赖Servlet API,而WebFlux项目默认不会引入Servlet相关的包,自然就找不到jakarta.servlet.Filter了。
解决方案
1. 替换Spring Security依赖
打开你的build.gradle,移除Servlet栈的安全依赖:
implementation("org.springframework.security:spring-security-web")
换成Reactive栈对应的WebFlux安全依赖:
implementation("org.springframework.security:spring-security-webflux")
2. 调整安全配置类
原来的SecurityConfig是基于Servlet栈的HttpSecurity,WebFlux需要用Reactive栈的ServerHttpSecurity,同时注解也要换成WebFlux专用的:
修改后的配置类如下:
@Configuration @EnableWebFluxSecurity class SecurityConfig { @Bean fun securityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain { http.csrf { csrf -> csrf.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse()) } .authorizeExchange { auth -> auth.anyExchange().authenticated() } .httpBasic(withDefaults()) return http.build() } }
注意几个关键点:
- 注解从
@EnableWebSecurity改成@EnableWebFluxSecurity - 配置参数从
HttpSecurity换成ServerHttpSecurity - 方法返回值从
SecurityFilterChain变成SecurityWebFilterChain - CSRF配置用
CookieServerCsrfTokenRepository(WebFlux版本的CSRF Token仓库) - 授权规则从
authorizeHttpRequests改成authorizeExchange
3. 验证依赖
确保你的依赖里现在只有Reactive相关的Spring Security组件:spring-security-config、spring-security-core、spring-security-webflux,没有spring-security-web。
为什么这样改?
Spring Boot针对Servlet栈(Spring MVC)和Reactive栈(WebFlux)提供了两套独立的Spring Security实现:
- Servlet栈用
spring-security-web,基于HttpSecurity配置 - Reactive栈用
spring-security-webflux,基于ServerHttpSecurity配置
混用两者就会导致依赖冲突或缺失必要的类,这就是你遇到启动报错的核心原因。
现在重新启动项目,应该就能正常运行了!
备注:内容来源于stack exchange,提问作者FailedUnitTest

