SpringMVC 学习(七)之报文信息转换器 HttpMessageConverter

目录

[1 HttpMessageConverter 介绍](#1 HttpMessageConverter 介绍)

[2 @RequestBody 注解](#2 @RequestBody 注解)

[3 @ResponseBody 注解](#3 @ResponseBody 注解)

[4 RequestEntity](#4 RequestEntity)

[5 ResponseEntity](#5 ResponseEntity)

[6 @RestController 注解](#6 @RestController 注解)


1 HttpMessageConverter 介绍

HttpMessageConverter 报文信息转换器,将请求报文(如JSON、XML、HTML等)转换为 Java 对象,或将 Java 对象转换为响应报文。SpringMVC 提供了多个内置的 HttpMessageConverter 实现,以支持不同的数据格式和数据类型。

以下是一些常见的 HttpMessageConverter 实现:

  • MappingJackson2HttpMessageConverter:用于将 Java 对象转换为 JSON 格式的 HTTP 响应,或将 JSON 格式的 HTTP 请求转换为 Java 对象

  • StringHttpMessageConverter:用于将 String 对象转换为 HTTP 响应的报文信息,或将 HTTP 请求中的报文信息转换为 String 对象

  • MappingJackson2XmlHttpMessageConverter:用于将 Java 对象转换为 XML 格式的 HTTP 响应,或将 XML 格式的 HTTP 请求转换为 Java 对象

  • ByteArrayHttpMessageConverter:用于将字节数组转换为 HTTP 响应的报文信息,或将 HTTP 请求中的报文信息转换为字节数组

HttpMessageConverter 提供了两个注解 (@RequestBody 和 @ResponseBody) 和两个类型 (RequestEntity 和 ResponseEntity)。 其中,@RequestBody 和 @ResponseBody 是用于处理 HTTP 请求和响应的注解,而 RequestEntity 和 ResponseEntity 是用于封装 HTTP 请求和响应的类型。

SpringMVC 能够自动根据请求的 Content-Type 和 Accept 来选择合适的转换器进行报文信息的转换。

  • @RequestBody 注解: 根据请求头的 Content-Type 属性,逐一匹配合适的HttpMessageConverter 转换器来读取数据
  • @ResponseBody 注解: 根据请求头的 Accept 属性(逗号分隔),来遍历可用的 HttpMessageConverter 转换器,以找到能够处理对应类型的转换器

注:使用转换器时,需要注意转换器的优先级,如上图所示,数字越小,优先级越高。

2 @RequestBody 注解

@RequestBody 注解可以获取请求体,需要在控制器方法设置一个形参,使用 @RequestBody 注解进行标识,当前请求的请求体就会为当前注解所标识的形参赋值

java 复制代码
@PostMapping("/create")
public void createNewObject(@RequestBody MyObject myObject) {
    // 处理接收到的对象
}

3 @ResponseBody 注解

@ResponseBody 注解用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体并响应到浏览器

java 复制代码
@GetMapping("/get")
@ResponseBody
public MyObject getObject() {
    MyObject myObject = // 获取对象的逻辑
    return myObject;
}

4 RequestEntity

RequestEntity 是封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过 getHeaders() 获取请求头信息,通过 getBody() 获取请求体信息。

java 复制代码
@RequestMapping("/testRequestEntity")
public String testRequestEntity(RequestEntity<String> requestEntity){
    System.out.println("requestHeader:"+requestEntity.getHeaders());
    System.out.println("requestBody:"+requestEntity.getBody());
    return "success";
}

5 ResponseEntity

ResponseEntity 用于封装 HTTP 响应的详细信息。它提供了一种灵活的方式来表示和处理 HTTP 响应,包括状态码、响应头和响应体。

java 复制代码
@GetMapping("/hello")
ResponseEntity<String> hello() {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.set("Custom-Header", "Value");

    return new ResponseEntity<>("Hello World!", headers, HttpStatus.OK);
}

上述代码中,"Hello World!" 是响应体的 Java 对象,可以是任意类型 (如 String、Object、List 等),headers 是响应头,HttpStatus.OK 是状态码,使用 HttpStatus 枚举来指定。

6 @RestController 注解

@RestController 注解是 SpringMVC 中用于标记控制器类的一个注解。它使得控制器类可以直接返回数据(字符串、对象、集合等)给客户端,而不需要额外的视图解析。

java 复制代码
@RestController
public class MyController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}
相关推荐
陈大爷(有低保)2 分钟前
题目:基于TCP/IP用DOM4j修改XML
java·服务器·tcp/ip
m0_7387559214 分钟前
.ideavimrc在idea打不开
java·vim·intellij-idea
超级小的大杯柠檬水15 分钟前
IDEA中实现springboot热部署
java·spring boot·intellij-idea
攀小黑19 分钟前
IDEA 24.1 could not autowire. No beans of ‘***‘ type found. 取消 某个类型的 警告
java·ide·intellij-idea
腊笔不小新xingo28 分钟前
READONLY You can‘t write against a read only replica
java·redis·bootstrap
JavaGuide36 分钟前
一条 SQL 语句在 MySQL 中是如何执行的?
java·数据库·后端·mysql
阿华的代码王国1 小时前
【JavaEE】——多线程(join阻塞,计算,引用,状态)
java·开发语言·数据结构·java-ee
楠了个难1 小时前
HDMI色块移动——FPGA学习笔记13
笔记·学习
江喜原1 小时前
微服务下设计一个注解标识是否需要登录
java·微服务·架构·登录
ABin-阿斌1 小时前
SpringBoot 整合 Easy_Trans 实现翻译的具体介绍
java·spring boot·后端