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

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 -->
</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的报错。

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

先说解决办法吧,大家可能比较关心解决办法:两种解决办法

1.  @Controller 替换成@RestController 注解:

@RestController
public class HomeController  {

}

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

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

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

问题原因: 

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

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

我们可以在服务中加入这两个配置,以便后台日志看到404报错的原因:
application.properties 文件中添加下面的2行配置:



spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false
 
 
DispatcherServlet类中 源码有如下属性,  throwExceptionIfNoHandlerFound 这个属性默认值是false,看看源码的注释大概能理解他的含义。 

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

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
如果需要返回一个 jsonObject,可以在后台的方法中将数据封装到一个 Map 或者其他类型的对象中,然后使用 SpringMVC 的 @ResponseBody 注解将该对象转换成 JSON 格式的数据返回给前端。 例如,下面是一个使用 @ResponseBody 注解返回 jsonObject 的示例: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @Controller @RequestMapping("/api") public class ApiController { @PostMapping("/post_txt") @ResponseBody public Map<String, Object> postTxt(@RequestParam("txt") String txt) { // 处理请求参数 txt Map<String, Object> result = new HashMap<>(); result.put("status", 200); result.put("message", "请求成功"); result.put("data", txt); return result; } } ``` 在这个例子中,我们使用 @PostMapping 注解来标识这个方法处理 POST 请求。方法的参数中使用 @RequestParam 注解来获取请求参数 txt。在方法体中,我们将处理结果封装到一个 Map 对象中,然后使用 @ResponseBody 注解将该对象转换成 JSON 格式返回给前端。 前端可以使用 jQuery 的 $.ajax 方法来发送 POST 请求,并接收后台返回的 JSON 数据。例如: ```javascript $.ajax({ type: "POST", url: "/api/post_txt", data: { txt: "Hello World!" }, dataType: "json", success: function(response) { console.log(response); // 输出:{ status: 200, message: "请求成功", data: "Hello World!" } }, error: function(xhr, status, error) { console.error("请求失败"); } }); ``` 注意,在这个例子中,我们使用了 jQuery 的 $.ajax 方法来发送 POST 请求,并将请求参数 txt 设置为 "Hello World!"。在请求成功后,我们将后台返回的 JSON 数据输出到控制台中。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值