问题描述
SpringBoot 项目访问接口时出现 “Not Found”
具体代码如下:
@Controller // 注意这里是@Controller
@RequestMapping("/test/ai/chat")
public class ChatController {
@GetMapping(value = "/close")
public void closeConnect(HttpServletRequest request) {
chatService.closeChat(request);
}
}
原因分析:
在Spring MVC中,当一个Controller类被标记为@Controller
(而不是@RestController
)时:
- 默认情况下,方法返回的字符串会被解析为视图名称
- Spring会尝试找到对应的视图模板来渲染
没有 @ResponseBody 时:
- Spring会试图将void解析为视图名,若找不到对应的视图,就会返回404
加上 @ResponseBody 后:
- 告诉Spring这个方法直接返回数据到响应体,不需要视图解析
- void类型会被正确处理为空响应
解决方案:
主要有两种:
方案1: 在方法上加 @ResponseBody
@Controller // 注意这里是@Controller
@RequestMapping("/test/ai/chat")
public class ChatController {
@GetMapping(value = "/close")
@ResponseBody // 关键是这个注解
public void closeConnect(HttpServletRequest request) {
chatService.closeChat(request);
}
}
方案2:将类注解改为 @RestController(相当于@Controller + @ResponseBody)
@RestController // 使用@RestController则方法不需要@ResponseBody
@RequestMapping("/test/ai/chat")
public class ChatController {
@GetMapping(value = "/close")
public void closeConnect(HttpServletRequest request) {
chatService.closeChat(request);
}
}