ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

@RestController和@ResponseBody @Controller对比

@RestController和@ResponseBody @Controller对比 RestController Controller ResponseBody类级别生效一三者分别的意思和用法1.Controller身份注解告诉 Spring这是控制器类接收请求默认行为方法返回的字符串 视图名称交给视图解析器去跳转页面Thymeleaf/JSP不会自动把返回值输出到响应体单纯只写 Controller方法 return 字符串Spring 会去找页面不是返回文本极易 404。2.ResponseBodya. 内部工作机制方法执行完毕拿到返回对象String / 实体类 / List触发 HttpMessageConverter默认 JacksonJava 对象 → 序列化为 JSON / 普通字符串写入 HTTP 响应体响应头自动设置 Content-Type返回实体对象Content-Type: application/json返回 String 字符串Content-Type: text/plain重点区分两种返回类型表现// 1. 返回字符串 StringResponseBodypublicStringfun(){returnhello;}// 响应原始文本 hello不会自动包装成JSON// 2. 返回实体对象ResponseBodypublicUserfun(){returnnewUser(张三,18);}// 自动转为 JSON{name:张三,age:18}b.两种标准使用方式搭配 Controller方式 1加在【方法上】局部生效推荐混合场景只对当前这一个接口生效其他方法依然保持 Controller 默认行为。ControllerRequestMapping(/demo)publicclassDemoController{// 普通页面跳转无ResponseBodyRequestMapping(/page)publicStringtoPage(){returnindex;// 去找 index.html 页面}// 接口返回文本仅该方法生效RequestMapping(/api)ResponseBodypublicStringapi(){return返回一段文本数据;// 直接输出字符串不找页面}}适用场景一个 Controller 里既有页面跳转又有接口。方式 2加在【类上】全局生效当前类所有方法类上添加本类全部方法都取消视图跳转统一返回响应数据。ControllerResponseBody// 类级别所有方法生效RequestMapping(/demo)publicclassDemoController{RequestMapping(/r1)publicStringr1(Strings1){return参数s1;}RequestMapping(/r2)publicUserr2(){returnnewUser(张三,20);// 自动转为JSON}}效果等价于 RestControllerRestController它是组合注解语法糖。Controller将类标识为控制器Spring 扫描注册接口ResponseBody类全局生效本类所有方法返回值直接写入 HTTP 响应体不进行视图跳转直接标注在 Controller 类上不需要额外写ResponseBodyRestControllerRequestMapping(/api)publicclassUserController{GetMapping(/hello)publicStringhello(){return你好;}GetMapping(/user)publicUsergetUser(){returnnewUser(张三,20);// 自动转为JSON}}核心特点作用范围整个类所有方法类上加了之后类里面每一个接口都拥有ResponseBody效果不用每个方法重复添加。返回规则返回 String直接以普通文本返回返回实体类、List、Map自动通过 Jackson 序列化为 JSON无法服务端页面跳转方法 return 字符串不会被当成页面视图名称不会去找 html/jsp只能返回数据。前后端分离项目首选专门用来写接口给前端返回 JSON 数据。
返回列表