【问题标题】:Spring boot application rest call gives 404 Error in tomcat for next requestSpring Boot 应用程序休息调用在 tomcat 中为下一个请求提供 404 错误
【发布时间】:2021-01-19 20:44:14
【问题描述】:

弹簧靴的新手。将战争部署到 tomcat 服务器。部署后的url是-http://localhost:8080/project-0.0.1-SNAPSHOT/。它显示欢迎 jsp 页面并且工作正常。启动按钮应该调用控制器启动项目。但是 url 调用转到 http://localhost:8080/startProject 而不是 http://localhost:8080/project-0.0.1-SNAPSHOT/startProject。 在快照版本之后手动输入 /startProject 后,项目工作正常。我缺少什么配置?请帮忙。谢谢。

我的代码如下 Welcome.jsp

<a type="button" class="start-btn" href="/startProject">Start New Project</a>

Pom.xml 4.0.0 org.springframework.boot spring-boot-starter-parent 2.3.4.发布 com.project 曼卡拉 0.0.1-快照 战争 曼卡拉 Spring Boot 演示项目

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

ProjectController.java

@Controller

公共类项目控制器 {

@Autowired
private ProjectService projectService;

@GetMapping(value = "/")
public String login() {
    return "project";
}

@GetMapping(value = "/startProject")
public String startNewGame(ModelMap model) {
    ProjectModel projectModel = projectService.startNewProject();
    model.addAttribute("projectModel", projectModel);
    return "project";
}

}

【问题讨论】:

  • 嗨,我认为这是因为当您输入 / 时,浏览器会转到根域,在这种情况下 localhost:8080/ 您可以尝试 &lt;a type="button" class="start-btn" href="startProject"&gt;Start New Project&lt;/a&gt; 而不使用 /,只需添加 url 的路径

标签: spring-boot


【解决方案1】:

由于您已将 application.properties 文件中的 server.servlet.context-path 属性设置为 project-0.0.1-SNAPSHOT,因此可以通过以下方式访问该应用程序网址:http://localhost:8080/project-0.0.1-SNAPSHOT/.

因此,您所有的 jsp 页面 url 都必须以上下文路径开头:/project-0.0.1-SNAPSHOT/**。

也就是说,Welcome.jsp 文件中的 startProject 页面 url 应该如下所示:

<a type="button" class="start-btn" href="/project-0.0.1-SNAPSHOT/startProject">Start New Project</a>

我有一个示例项目可以证明对您有帮助:https://github.com/nkumashi/springboot-webmvc-demo

【讨论】:

  • 感谢您的建议。我知道我需要提及上下文路径。但是使用版本控制如何配置上下文路径而不在 JSP 中对其进行硬编码。我尝试在应用程序属性-server.context-path=project 中设置上下文路径。但是如何在每次构建时动态配置版本?
  • 我认为这很容易处理。一个例子: 1. 在你的控制器中创建一个变量来保存上下文路径。私有字符串上下文路径; 2. 注入值: public UserController(@Value("${server.servlet.context-path}") String contextPath) { this.contextPath = contextPath; } 3. 将值加载到模型中:@GetMapping("/home") public String register(Model model) { model.addAttribute("contextPath", this.contextPath);回家”; 4. 引用它:注册用户
猜你喜欢
  • 2021-08-08
  • 2017-05-30
  • 2020-10-23
  • 1970-01-01
  • 2018-08-24
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
相关资源
最近更新 更多