我正在编写一个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);
}
}
答案 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中,您可以将视图作为String
或ModelAndView
对象返回。
重要说明:
在这两种情况下,您都必须注意相对/绝对路径:
/
,则说明您使用的是绝对路径。@RequestMapping
无关紧要,直接将其自身作为最终视图名称。/
,则说明您使用的是相对路径(相对于类路径),因此附加到类级别 @RequestMapping
以构造最终视图名称。因此,在使用Spring MVC时,您必须考虑上述注意事项。
示例:
1.在spring(boot)结构的test1.html
文件夹中创建两个HTML文件test2.html
和static
:
请注意,在相对路径的情况下,类级别 @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)]
String
和ModelAndView
的不同情况。
@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=.html
或appliction.properties
,而不必声明.html
以上代码的后缀。
最好的问候