开发者

springmvc Controller方法没有加@ResponseBody导致api访问404问题

目录
  • springmvc Controller方法没有加@ResponseBody导致api访问404
  • 先说解决办法
    • 1.@Controller替换成@RestController注解
    • 2.Controller中的方法上加上@ResponseBody注解
  • 问题原因
    • 总结

      springmvc Controller方法没有编程客栈加@ResponseBody导致api访问404

      使用的 spring boot是2.4.5版本, 对应的是spring 5 

      <编程parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.4.5</version>
         <relativePath/> <!-- lookup parent from repository -->
      &ljavascriptt;/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 请求上加了 @ResponseBody注解, /ok请求上没有加@ResponseBody注解 ,导致

      /go 请求访问正常, /ok访问出现 页面 404的报错。

      springmvc Controller方法没有加@ResponseBody导致api访问404问题

      为啥Controller 方法上加了 @ResponseBody注解,和不加区别这么大呢 ?

      先说解决办法

      大家可能比较关心解决办法:两种解决办法

      1.@Controller替换成@RestController注解

      @RestController
      public class HomeController  {
       
      }

      2.Controller中的方法上加上@ResponseBody注解

          @RequestMapping("/go")
          @ResponseBody
          public String go(){
              return "go";
          }

      1. @RestController 注解 包括了 @Controller 和@ResponseBody 两个注解。 

      问题原因

      使用@Controller注解,如果你的方法上没有使用 @ResponseBody注解,会导致spring mvc框架认为你这个方法的返回值就是 ModelAndViephpwer对象,相当于是一个 待跳转的页面,导致跳转的时候找不到这个 viewer ,导致404报错。

      例如上面的Controller方法,  return "go", 会去配置的目录下找 go页面,可能是JSP,或者 Freemarker,或者 Velocity,或者Thymeleaf (https://www.thymeleaf.org/官网)

      我们可以在服务中加入这两个配置,以便后台日志看到404报错的原因:

      application.properties 文件中添加下面的2行配置:  

      spring.mvjsc.throw-exception-if-no-handler-found=true
      spring.web.resources.add-mappings=false

      DispatcherServlet类中 源码有如下属性,  throwExceptionIfNoHandlerFound 这个属性默认值是false,看看源码的注释大概能理解他的含义。 

      到此,估计你也明白了,为啥Controller方法上不加 @ResponseBody注解会导致 访问出现 404报错吧 。

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜