【问题标题】:SpringBoot - Controller and RequestMapping always returns 404SpringBoot - Controller 和 RequestMapping 总是返回 404
【发布时间】:2020-02-09 14:49:26
【问题描述】:

我正在尝试示例here 的简化版本。该项目是在 VSCode 中使用 Springboot 扩展附带的初始化程序设置的。

DemoApplication.java

package com.sample.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

CalculatorController.java

package com.sample.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CalculatorController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }
}

我正在从 VSCode 运行应用程序并以:http://localhost:8080/ 访问它。我不断收到404 错误。当我将 @Controller 注释更改为 @RestController 注释时,它可以工作。另外,还有resources\templates\index.html

我错过了什么?

【问题讨论】:

  • 你的 pom.xml 是什么?项目布局如何?您是如何简化示例的?
  • pom.xml 没有变化;它与 VSCode 设置的相同。该项目的布局是在 VSCode 中设置了初始化程序。简化是只为/ 编写映射。
  • 当您使用mvn spring-boot:run 运行应用程序时会发生什么。请您发布您的 pom.xml 并发布项目的布局吗?说你在 VSCode 中设置它并不能告诉我们它是什么。
  • 好的。 pom 与示例中的 pom 相同。您缺少依赖项。
  • 包括thymeleaf,它现在可以工作了!请添加您的评论作为答案,以便我接受。

标签: java spring rest maven spring-boot


【解决方案1】:

上下文是对 Spring MVC 的一个非常高的概述,它使用 Front Controller 设计模式设计,其中 Dispatcher servlet 将接收所有请求并调用相应的处理程序,以便调用您的控制器方法是您的控制器类被注释 @Controller annoation dispatcher servlet 考虑了返回值并尝试在 MVC 中定位 View,因此您需要配置 ViewResolver 的任何一种实现,在您需要配置 InternalResourceViewResolver 和 Themeleaf 以及相应的视图位置。

如果您的控制器使用@RestController 注释,则处理程序的返回值将被视为 Http 响应 Dispatcher servlet 不会查看任何视图(它会将返回值视为 http 响应正文)

你可以用@Controller注解本身实现同样的事情,只需在你的处理方法中添加这个注解@ResponseBody(返回值被认为是http响应)。

【讨论】:

    【解决方案2】:

    Spring MVC 中的@RestController 注解只不过是@Controller 和@ResponseBody 注解的组合。它被添加到 Spring 4.0 中,使 Spring 框架中 RESTful Web Services 的开发更加容易。

    @Controller 的工作是创建模型对象的 Map 并找到视图,但 @RestController 只是简单地返回对象,对象数据直接以 JSON 或 XML 的形式写入 HTTP 响应。

    @SuppressWarnings({})
    @RestController
    public class TestController {
        @PostMapping("/test/1")
        public Object Test1(@RequestBody HashMap<String, String> obj) throws ParseException, IOException {
            return null;
        }
    

    阅读更多:https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html#ixzz62Jw1WOs3

    【讨论】:

      【解决方案3】:

      @RestController 是@Controller 和@ResponseBody 的组合。所以请求处理方法将对象作为Json 或XML 返回到HttpResponse,因此不需要@ResponseBody。

      @RestController
      public class UserRestController { }
      
      @Controller
      @ResponseBody
      public class UserController { }
      

      @ResponseBody 是一个 Spring 注解,它绑定了一个返回值到 Web 响应体的方法。它告诉控制器返回的对象自动序列化为 JSON 并传递回 HttpResponse 对象。

      【讨论】:

        猜你喜欢
        • 2022-11-26
        • 2016-03-02
        • 1970-01-01
        • 2021-08-05
        • 2015-07-31
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        相关资源
        最近更新 更多