SpringMVC中@RequestBody和@ResponseBody两个注解的区别
📒 程序员小王的博客:程序员小王的博客
🎉 欢迎点赞 👍 收藏 ⭐留言 📝
😊 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
今天我想详细的了解一下Spring MVC中@RequestBody和@ResponseBody的区别,让我自己在开发中更好的使用这两个注解
一、@RequestBody
1、作用
在SpringMvc中。@RequestBody注解会自动的把一个JSON的字符串转换为一个java对象
- 前端的json字符串
{
"id":15,
"name":"刘建平",
"salary":32000,
"age":23
}
-= 将前端的json转换为java对象
如果HttpRequestBody携带了正确的JSON,SpringMVC会自动将这个JSON反序列化为一个java对象。通常情况下,我们必须使用@RequestBody
标注的java类与客户端发送的JSON相对应
- 注意:java类中的属性名与JSON中的键名必须完全一样,不一样的键值是不会被反序列化到java对象中的
public class TEmp implements Serializable {
private static final long serialVersionUID = 429425014454194277L;
private Integer id;
private String name;
private String salary;
private Integer age;
2、作用范围
查看源码可知:作用范围只能在方法的参数列表上
@Target({ElementType.*})
:作用:用来指定自定义注解的作用范围
- Target中的ElementType
//类上
TYPE,
/**成员变量上 */
FIELD,
/**方法上*/
METHOD,
/**参数上*/
PARAMETER,
/** 构造方法上*/
CONSTRUCTOR,
/** 本地变量上 */
LOCAL_VARIABLE,
/** 注解类型上 */
ANNOTATION_TYPE,
/** 包上 */
PACKAGE,
/**
*
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
*
*
* @since 1.8
*/
TYPE_USE
@Retention
:指定注解的生效时期,其中RUNINE指运行时有效
//JDK提供的注解,修饰注解的注解,元注解
@Target({ElementType.PARAMETER}) //作用:勇来指定自定义注解的作用范围
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
boolean required() default true;
}
二、@ResponseBody
@ResponseBody注解告诉控制器,返回的对象需要自动化序列成JSON,并通过HttpResponseBody返回给客户端
- 控制器通过id查询用户
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@ResponseBody
@GetMapping("{id}")
public ResponseEntity<TEmp> queryById(@PathVariable("id") Integer id) {
return ResponseEntity.ok(this.tEmpService.queryById(id));
}
- 在浏览器的开发者控制台或者使用像Postman这样的工具,我们可以看到以下的响应:
{
"id": 8,
"name": "王恒杰",
"salary": "12000.0",
"age": 21
}
- 请记住,如果控制器使用了
@RestController
注解,就不需要再使用@ResponseBody
了,因为它已经默认添加的。
查看@RestController
的源码@RestController=@Controller+@ResponseBody
并且@RestController
的作用范围是在类上
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}