Spring中@Controller返回404但@RestController正常的原因排查
@RequestMapping("/api/test") @Controller public class TestController { @RequestMapping("/html") public String retHtml() { return "<html></html>"; } }
我编写了一个简易的TestController,使用@RestController注解时可正常访问接口,但切换为@Controller注解后返回HTTP 404状态码,请问造成该现象的可能原因有哪些?
注解核心逻辑差异:
@RestController是@Controller与@ResponseBody的组合注解。用@Controller时,方法返回的字符串默认会被当作视图名称,Spring会尝试查找对应名称的视图模板文件(比如JSP、Thymeleaf模板);而@RestController会直接把返回值作为响应体返回给客户端。你的代码返回<html></html>,Spring会去寻找同名视图文件,显然不存在,因此返回404。未添加
@ResponseBody注解:如果想用@Controller直接返回字符串内容,必须在方法上添加@ResponseBody注解,否则Spring会按视图解析逻辑处理,找不到对应视图就返回404。缺少视图解析器配置:若你确实想返回视图,但项目中未配置合适的视图解析器(比如
InternalResourceViewResolver),Spring无法定位视图文件位置,也会返回404。而@RestController不需要依赖视图解析器,所以不受影响。视图路径/名称不匹配:如果你的意图是返回某个HTML视图文件,但方法返回的字符串与实际视图文件的路径、名称不一致,比如实际视图在
src/main/resources/templates/test.html,但你返回的是<html></html>,自然找不到对应视图资源,导致404。
内容的提问来源于stack exchange,提问作者Seaky Lone

