当前位置: 首页 > 知识库问答 >
问题:

Spring控制器被调用,但返回404

范承教
2023-03-14

我正在编写一个Spring Boot应用程序。我编写了一个简单的控制器,每当endpoint被命中时就会被调用,但它仍然返回状态404,而不是指定的返回值。

HelloController

@Controller
public class MessageRequestController {

    @RequestMapping(method = RequestMethod.GET, value = "/hello", produces = "application/json")
    public String hello() {
        System.out.println("Hit me!");
        return "Hello, you!";
    }
}

现在,每当我调用localhost:8080/hello时,我都会看到控制台日志Hit me!,但是你好,你!永远不会返回。邮递员输出:

{
    "timestamp": 1516953147719,
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/hello"
}

应用JAVA

@SpringBootApplication
@ComponentScan({"com.sergialmar.wschat"}) // this is the root package of everything
@EntityScan("com.sergialmar.wschat")
public class Application {

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

共有3个答案

彭弘方
2023-03-14

正如您所看到的“打我”,没有映射问题,但是在您的“请求映射”注释中,您指定了一个“应用程序/json”的产生类型,并返回一个没有格式化且没有任何头的简单可怜的字符串(“内容类型:应用程序/json”)。

添加标题并格式化输出。

王辉
2023-03-14

简短版本:

用ResponseBody注释endpoint方法,将返回值绑定到响应体。

@Controller
public class MessageRequestController {

    @RequestMapping(method = RequestMethod.GET, value = "/hello", produces = "application/json")
    @ResponseBody
    public String hello() {
        System.out.println("Hit me!");
        return "Hello, you!";
    }

}

您可以改为使用RestController而不是Controller注释类,以将ResponseBody应用于类的每个方法。

@RestController
public class MessageRequestController {

    @RequestMapping(method = RequestMethod.GET, value = "/hello", produces = "application/json")
    public String hello() {
        System.out.println("Hit me!");
        return "Hello, you!";
    }

}

在@Controller中,使用SpringWebMVC中的默认模型视图,实际上是在告诉Spring渲染名为Hello,you!的视图!。tml来自您的参考资料目录(src/main/resources/templates用于Spring Boot项目,如果我没记错的话)。

有关Spring MVC REST工作流的更多信息,请阅读本文。

一旦您更加熟悉这些概念,就可以使用ResponseEntity进一步定制endpoint方法。

东门玺
2023-03-14

改变你的方法返回一个<代码>响应实体

@RequestMapping(method = RequestMethod.GET, value = "/hello", produces = "application/json")
    public ResponseEntity<String> hello() {
        System.out.println("Hit me!");
        return new ResponseEntity<String>("Hello, you!", HttpStatus.OK);
    }

或者将控制器更改为RestController

@RestController
public class MessageRequestController {...}

卷曲

ubuntu:~$ curl -X GET localhost:8080/hello
Hello, you!
 类似资料:
  • 你好,我是拉威尔的新手,也许这对你们来说太傻了。在laravel 8中,路由web。php我创建了一条如下的路线: 我想问的是,我们也可以从回调视图返回控制器吗?所以在路由 /editprofile中,第二个参数不是'App\Http\Controller\SiteController@edit_profile',而是一个回调函数,如路由'/home'。 但是它返回错误哈哈。假设我不想用__con

  • 如果可以从Spring返回,我很好奇 这样做可以吗?我试过了,Spring返回的不是流的值。 我应该继续返回

  • 我很难理解mono 的用法。请问这个Mono 能给Mono带来什么样的好处? 谢谢。

  • 我是新来的Spring应用程序。我试图创建小Spring应用程序,但我得到404错误消息。似乎控制器(indexController)没有开始调用。我累了调试,但它不在那里。 文件位置: /WebContent/WEB-INF/pages/index.html /WebContent/WEB-INF/HelloWebServlet。xml /WebContent/WEB-INF/web.xml H

  • 我一直在思考使用Spring MVC设计JSON API的最佳方法。众所周知,IO很昂贵,因此我不想让客户端进行多次API调用以获得他们需要的东西。然而,与此同时,我不一定想归还厨房水槽。 例如,我正在开发一个类似于IMDB的游戏API,但用于视频游戏。 如果我返回与游戏相关的所有内容,它将看起来像这样。 /api/game/1 然而,他们可能不需要所有这些信息,但他们可能需要这些信息。从I/O和