kne*_*406 5 java spring tomcat
TL;DR:我有一个适用于 Tomcat 9 的 Spring MVC helloworld 应用程序。 Tomcat 10 上的同一个应用程序为 Web 请求映射提供了 404 错误。
问题
将 Spring MVC 5 helloworld 应用程序部署到 Tomcat 10 时,该应用程序为 Web 请求映射提供 404 错误。相同的 helloworld 应用程序适用于 Tomcat 9。它在 Tomcat 9 上显示 helloworld 消息。
我所期待的
我希望应用程序在 Tomcat 10 上显示 helloworld 消息。
环境
我进行的研究
我在 Spring 参考手册的 Web Servlet 部分进行了研究。我还在线测试了 Spring MVC 教程。这些教程适用于 Tomcat 9。但是,相同的教程在 Tomcat 10 上失败了。我还在 Tomcat 10 上执行了谷歌搜索。我看到了对 Jakarta EE 的引用,但不确定这是否是问题的根源。Java EE 8 和 Jakarta EE 8 向后兼容。
如何繁殖
我创建了一个非常基本的 helloword 项目来测试这一点。这是我用于该项目的代码。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.spring</groupId>
<artifactId>example-spring</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
项目初始化器.java
package com.example;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ProjectInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { PureJavaConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
纯Java配置文件
package com.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class PureJavaConfig {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setSuffix(".jsp");
resolver.setPrefix("/WEB-INF/jsp/");
return resolver;
}
}
Run Code Online (Sandbox Code Playgroud)
教程控制器.java
package com.example;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TutorialController {
@GetMapping("/")
public String home() {
return "home";
}
}
Run Code Online (Sandbox Code Playgroud)
主页.jsp
<html>
<body>Hello World of Spring! <%= java.time.LocalDateTime.now() %></body>
</html>
Run Code Online (Sandbox Code Playgroud)
这个项目在 Tomcat 9 上运行正常。它显示 helloworld 消息。但是,当我在 Tomcat 10 上运行时,收到 404 错误消息。
kne*_*406 10
TL;DR:Spring MVC 5 不能在 Tomcat 10 上运行,因为包重命名javax.*为jakarta.*。
经过进一步的研究,我能够找到我的问题的答案。Spring MVC的5确实不能在Tomcat 10.这项工作是因为Tomcat的10是基于雅加达EE 9中,其中原料药包名称从javax.*到jakarta.*。
Tomcat 10 在下载网页上提到了这一点:
Tomcat的10起的用户应该知道,从Java EE的迁移到雅加达EE与Java EE转移到Eclipse基金会的一部分,因此,初级包装,所有已经实现的API已经从
javax.*到jakarta.*。这几乎肯定需要更改代码才能使应用程序从 Tomcat 9 及更早版本迁移到 Tomcat 10 及更高版本。
对于 Spring MVC 5,Spring MVC DispatcherServlet依赖于javax.servlet.*包命名空间。这是使用 Java EE 8javax包命名。由于 Tomcat 10 基于 Jakarta EE 9,因此javax不支持用于命名的包。这解释了为什么 Spring MVC 5 在 Tomcat 10 上不起作用。
有针对 Spring 框架提交的 github 问题与此相关:
支持 Jakarta EE 9(jakarta.* 命名空间中的注释和接口)
就我而言,我不会迁移到 Tomcat 10,而是继续使用 Tomcat 9,直到 Spring 框架升级到 Jakarta EE 9。
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |