You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot整合Security、MVC与Integration的冲突解决及上下文分离

Spring Boot IoT管控平台问题解决方案

核心问题定位

你遇到的java: cannot access javax.servlet.Filter class file for javax.servlet.Filter not found错误,本质不是单纯缺依赖,而是Spring Boot版本规范兼容+模块上下文冲突导致的:

  • Spring Boot 3.x全面切换到Jakarta EE,旧的javax.servlet包已被替换为jakarta.servlet,手动加jakarta.servlet-api反而可能和Spring Boot自带的依赖版本冲突。
  • TCP长连接模块不需要Servlet环境,但当前配置下它和MVC模块共享了同一个Spring上下文,导致Security的Servlet依赖被错误加载到无Servlet环境的模块中。

1. 依赖规范统一与冲突排除

适配Spring Boot版本

  • 若用Spring Boot 3.x,不要手动添加jakarta.servlet-api,spring-boot-starter-web已经包含了适配Jakarta的Servlet API依赖。
  • 给TCP模块排除Web/Servlet相关依赖(如果是单模块,就在spring-boot-starter-integration里排除;如果是多模块,直接不引入Web依赖):
    <!-- Maven示例:TCP模块排除Web依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-integration</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  • 确保Spring Security用官方 starter:spring-boot-starter-security,它会自动适配当前Spring Boot的规范(Jakarta或javax)。

代码中替换Servlet包引用

把所有代码里的javax.servlet导入替换成jakarta.servlet,比如:

// 旧代码
import javax.servlet.Filter;
// 新代码
import jakarta.servlet.Filter;

2. 隔离模块上下文,避免配置冲突

方式一:单模块内拆分配置上下文

给MVC和TCP模块分别创建独立的配置类,通过包扫描和自动配置排除实现隔离:

MVC模块配置(带Security)

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = "com.yourpackage.iot.mvc")
// 仅加载MVC和Security相关自动配置
@AutoConfigureAfter(SecurityAutoConfiguration.class)
public class WebSecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // 你的认证授权规则,比如登录页放行、接口权限控制
        http.authorizeHttpRequests(auth -> auth
                .requestMatchers("/login", "/static/**").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(form -> form.loginPage("/login").permitAll());
        return http.build();
    }
}

TCP模块配置(独立上下文)

@Configuration
@EnableIntegration
@ComponentScan(basePackages = "com.yourpackage.iot.tcp")
// 排除Web和Security自动配置,避免加载Servlet环境
@SpringBootApplication(exclude = {
    SecurityAutoConfiguration.class,
    WebMvcAutoConfiguration.class
})
public class TcpServerConfig {
    // Spring Integration TCP连接配置示例
    @Bean
    public TcpNettyConnectionFactory tcpConnectionFactory() {
        TcpNettyConnectionFactory factory = new TcpNettyConnectionFactory(8888);
        factory.setSerializer(new ByteArrayCrLfSerializer());
        return factory;
    }

    @Bean
    public TcpInboundGateway tcpInboundGateway(TcpNettyConnectionFactory factory) {
        TcpInboundGateway gateway = new TcpInboundGateway();
        gateway.setConnectionFactory(factory);
        gateway.setRequestChannelName("tcpInputChannel");
        return gateway;
    }
}

方式二:拆分多模块项目(更彻底)

把项目拆成两个独立的Spring Boot子模块,完全隔离上下文:

  • iot-web-mvc:依赖spring-boot-starter-web、spring-boot-starter-security、spring-boot-starter-data-jpa,负责网页、REST API、用户认证。
  • iot-tcp-server:依赖spring-boot-starter-integration、spring-integration-ip,负责IoT设备长连接,无Web/Security依赖。
  • 两个模块通过Redis、RabbitMQ或数据库实现数据交互,彻底避免配置冲突。

3. 最终修复步骤

  1. 替换所有javax.servlet为jakarta.servlet的代码导入。
  2. 清理Maven/Gradle缓存,重新构建:
    # Maven
    mvn clean install
    # Gradle
    ./gradlew clean build
    
  3. 启动项目,验证:
    • MVC模块的网页/API能正常触发Security认证。
    • TCP模块的长连接服务正常运行,无Servlet相关报错。

内容的提问来源于stack exchange,提问作者sajjad Movahedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:40:41