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

迁移Spring MVC至Tomcat10+Jakarta时JSP出现类型解析错误

问题分析:迁移至Tomcat10+Jakarta技术栈时JSP报错javax.servlet.jsp cannot be resolved to a type

问题场景

近期将Spring Framework MVC项目迁移至Tomcat 10与Jakarta技术栈,JSP代码片段如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<c:set var="localeCode" value="${pageContext.response.locale}" />

Eclipse(Spring Tool Suite)提示错误:javax.servlet.jsp cannot be resolved to a type,移除${pageContext.response.locale}代码后错误消失。当前Maven依赖配置如下:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>6.0.6</version>
    </dependency>
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>jakarta.servlet.jsp</groupId>
        <artifactId>jakarta.servlet.jsp-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>jakarta.servlet.jsp.jstl</groupId>
        <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>jakarta.el</groupId>
        <artifactId>jakarta.el-api</artifactId>
        <version>5.0.1</version>
    </dependency>
    <dependency>
         <groupId>jakarta.validation</groupId>
         <artifactId>jakarta.validation-api</artifactId>
         <version>3.0.2</version>
     </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>2.0.0</version>
    </dependency> 
</dependencies>

核心原因

  1. JSTL标签库URI未适配Jakarta:你使用的JSTL URI是旧的http://java.sun.com/jsp/jstl/core,对应传统javax.servlet.jsp.jstl命名空间。Tomcat10完全切换到Jakarta EE的jakarta.servlet.*命名空间,当EL表达式访问pageContext时,底层会尝试加载旧的javax.servlet.jsp类,但你的依赖只有Jakarta版本,导致类型解析失败。
  2. JSTL实现版本不匹配:Spring 6.0依赖Jakarta EE 10(Servlet 6.0),但你用的org.glassfish.web:jakarta.servlet.jsp.jstl:2.0.0是Jakarta EE 9版本,版本不兼容会引发类路径冲突。
  3. IDE项目配置未更新:STS可能缓存了旧的Servlet/JSP facet配置(比如停留在Servlet 5.0及以下),没有同步到Jakarta对应的Servlet 6.0/JSP 3.1版本,导致IDE无法正确识别依赖。

解决方案

  • 更新JSTL标签库URI:将JSTL的taglib替换为Jakarta官方URI:
    <%@ taglib prefix="c" uri="https://jakarta.ee/xml/ns/jstl/core"%>
    
  • 升级JSTL实现版本:替换为适配Jakarta EE 10的版本:
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>3.0.0</version>
    </dependency>
    
  • 同步IDE项目配置:
    1. 右键项目 → Properties → Project Facets,将Dynamic Web Module设为6.0,JSP设为3.1。
    2. 执行mvn clean compile,然后右键项目 → Maven → Update Project,刷新依赖并清除IDE缓存。
  • 临时替代方案(可选):如果仍有问题,可以在控制器中将locale存入Model,再在JSP中获取,避免直接访问pageContext.response.locale,但核心还是要解决命名空间和依赖的适配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:43:19