Spring控制器被调用但返回404

时间:2018-01-26 08:34:05

标签: java spring

我正在编写一个Spring Boot应用程序。我编写了一个简单的控制器,只要命中端点就会调用它,但它仍然返回状态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!",但永远不会返回"Hello, you!"。邮差输出:

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

Application.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);
    }
}

4 个答案:

答案 0 :(得分:13)

更改方法返回ResponseEntity<T>

@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 {...}

CURL

ubuntu:~$ curl -X GET localhost:8080/hello
Hello, you!

答案 1 :(得分:4)

简短版本:

使用ResponseBody注释您的端点方法,以将返回值绑定到响应正文。

@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,您可以使用Spring Web MVC中的默认模型视图,而您实际上是在告诉spring从资源目录(Hello, you!.tml)呈现名为src/main/resources/templates的视图Spring Boot项目,如果我没记错的话。)

有关Spring MVC REST工作流的更多信息,请阅读this article

一旦您对这些概念更熟悉,您甚至可以使用ResponseEntity进一步自定义端点方法。

答案 2 :(得分:2)

如你所见&#34;点击我&#34;,没有映射问题,但在你的@RequestMapping注释中,你指定了一个产品类型为&#34; application / json&#34;并且你返回一个简单的可怜字符串,没有格式化,没有任何标题(&#39; Content-Type:application / json&#39;)。

添加标题并格式化输出。

答案 3 :(得分:0)

如果一切正常,但收到404,请检查以下答案:

如您所知:
在Spring MVC中,您可以将视图作为StringModelAndView对象返回。

重要说明:
在这两种情况下,您都必须注意相对/绝对路径

  1. 如果您在视图名称的开头声明/,则说明您使用的是绝对路径
    也就是说,类级别 @RequestMapping无关紧要,直接将其自身作为最终视图名称
  2. 如果您在视图名称的开头声明/,则说明您使用的是相对路径(相对于类路径),因此附加类级别 @RequestMapping以构造最终视图名称

因此,在使用Spring MVC时,您必须考虑上述注意事项。

示例:
1.在spring(boot)结构的test1.html文件夹中创建两个HTML文件test2.htmlstatic
请注意,在相对路径的情况下,类级别 @RequestMapping表现为文件夹路径。

--- resources
    --- static
        --- classLevelPath     //behaves as a folder when we use relative path scenario in view names   
            --- test2.html      //this will be used for relative path [case (2)]
        --- test1.html          //this will be used for absolute path [case (1)]

  1. 创建如下所示的控制器类。此示例显示了在相对绝对路径中都返回StringModelAndView的不同情况。

@Controller
@RequestMapping("/classLevelPath")
public class TestController {

    //case(1)
    @RequestMapping("/methodLevelAbsolutePath1")
    public String absolutePath1(Model model){
        //model.addAttribute();
        //...
        return "/test1.html";  
    }

    //case(1)
    @RequestMapping("/methodLevelAbsolutePath2")
    public ModelAndView absolutePath2(Model model){
        ModelAndView modelAndView = new ModelAndView("/test1.html");
        //modelAndView.addObject()
        //....
        return modelAndView; 
    }

    //case(2)
    @RequestMapping("/methodLevelRelativePath1")
    public String relativePath1(Model model){
        //model.addAttribute();
        //...
        return "test2.html";
    }

    //case(2)
    @RequestMapping("/methodLevelRelativePath2")
    public ModelAndView relativePath2(Model model){
        ModelAndView modelAndView = new ModelAndView("test2.html");
        //modelAndView.addObject()
        //....
        return modelAndView;  
    }


}

注意:
您可以在ViewResolver中指定视图文件的后缀(例如,Spring Boot InternalResourceViewResolver文件中的spring.mvc.view.suffix=.htmlappliction.properties,而不必声明.html以上代码的后缀。

最好的问候