springmvc Controller方法沒有加@ResponseBody導(dǎo)致api訪問404問題
springmvc Controller方法沒有加@ResponseBody導(dǎo)致api訪問404
使用的 spring boot是2.4.5版本, 對(duì)應(yīng)的是spring 5
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent>
spring mvc 版本是: spring-webmvc:5.3.6
看代碼:
@Controller public class HomeController { private ApplicationContext applicationContext = null; @RequestMapping("/go") @ResponseBody public String go(){ return "go"; } @RequestMapping("/ok") public String ok(){ return "success"; } }
controller使用的是 @Controller注解
/go 請(qǐng)求上加了 @ResponseBody注解, /ok請(qǐng)求上沒有加@ResponseBody注解 ,導(dǎo)致
/go 請(qǐng)求訪問正常, /ok訪問出現(xiàn) 頁(yè)面 404的報(bào)錯(cuò)。
為啥Controller 方法上加了 @ResponseBody注解,和不加區(qū)別這么大呢 ?
先說解決辦法
大家可能比較關(guān)心解決辦法:兩種解決辦法
1.@Controller替換成@RestController注解
@RestController public class HomeController { }
2.Controller中的方法上加上@ResponseBody注解
@RequestMapping("/go") @ResponseBody public String go(){ return "go"; }
1. @RestController 注解 包括了 @Controller 和@ResponseBody 兩個(gè)注解。
問題原因
使用@Controller注解,如果你的方法上沒有使用 @ResponseBody注解,會(huì)導(dǎo)致spring mvc框架認(rèn)為你這個(gè)方法的返回值就是 ModelAndViewer對(duì)象,相當(dāng)于是一個(gè) 待跳轉(zhuǎn)的頁(yè)面,導(dǎo)致跳轉(zhuǎn)的時(shí)候找不到這個(gè) viewer ,導(dǎo)致404報(bào)錯(cuò)。
例如上面的Controller方法, return "go", 會(huì)去配置的目錄下找 go頁(yè)面,可能是Jsp,或者 Freemarker,或者 Velocity,或者Thymeleaf (https://www.thymeleaf.org/官網(wǎng))
我們可以在服務(wù)中加入這兩個(gè)配置,以便后臺(tái)日志看到404報(bào)錯(cuò)的原因:
application.properties 文件中添加下面的2行配置:
spring.mvc.throw-exception-if-no-handler-found=true spring.web.resources.add-mappings=false
DispatcherServlet類中 源碼有如下屬性, throwExceptionIfNoHandlerFound 這個(gè)屬性默認(rèn)值是false,看看源碼的注釋大概能理解他的含義。
到此,估計(jì)你也明白了,為啥Controller方法上不加 @ResponseBody注解會(huì)導(dǎo)致 訪問出現(xiàn) 404報(bào)錯(cuò)吧 。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合redis實(shí)現(xiàn)輸入密碼錯(cuò)誤限制登錄功能
遇到這樣的需求需要實(shí)現(xiàn)一個(gè)登錄功能,并且2分鐘之內(nèi)只能輸入5次錯(cuò)誤密碼,若輸入五次之后還沒有輸入正確密碼,系統(tǒng)將會(huì)將該賬號(hào)鎖定1小時(shí),這篇文章主要介紹了SpringBoot整合redis并實(shí)現(xiàn)輸入密碼錯(cuò)誤限制登錄功能,需要的朋友可以參考下2024-02-02淺談Java中實(shí)現(xiàn)深拷貝的兩種方式—clone() & Serialized
這篇文章主要介紹了Java中實(shí)現(xiàn)深拷貝的兩種方式—clone() & Serialized,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Java開發(fā)中POJO和JSON互轉(zhuǎn)時(shí)如何忽略隱藏字段的問題
這篇文章主要介紹了Java開發(fā)中POJO和JSON互轉(zhuǎn)時(shí)如何忽略隱藏字段的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02