撵延兵 发表于 2026-1-28 06:00:51

spring boot--内容协商

内容协商

内容协商机制是指服务器根据客户端的请求来决定返回资源的表现形式,由springmvc提供。
就是客户端要什么样的格式,客户端就返回什么样的格式。比如json或者xml。
实现内容协商的两种方式


[*]通过HTTP请求头(如accept)
[*]通过请求参数如:format
指定客户端接收的数据类型。
通过HTTP请求头(如accept)

响应json格式

// 默认响应json字符串@RestControllerpublic class UserController {    @Autowired    private UserService userService;    @GetMapping("/detail")    public User detail(){      return userService.getUserById();    }}响应xml

先引入依赖
                  com.fasterxml.jackson.dataformat            jackson-dataformat-xml      实体类代码
@Data@NoArgsConstructor// 将Java对象转换成xml格式的字符串@JacksonXmlRootElementpublic class User {    private String name;    private Integer age;    public User(String name, Integer age) {      this.name = name;      this.age = age;    }}不用修改controller。这样就会根据客户端请求的accept来返回对应格式的数据。
通过请求参数如:format

请求地址:http://localhost:8080/detail?format=json。如果优先考虑使用format方式,需要以下配置
# 内容协商时,优先考虑请求参数format方式,参数名必须是formatspring.mvc.contentnegotiation.favor-parameter=true# 配置format参数的名称为type,那么请求路径就是http://localhost:8080/detail?type=jsonspring.mvc.contentnegotiation.parameter-name=type消息转换器

请求时通过哪些条件确定使用哪个消息转换器

springmvc会检查请求的content-type。以确定请求体的消息格式。
响应时通过哪些条件确定使用哪个消息转换器

springmvc会检查请求的accept。以确定请求体的消息格式。
定义自己的HTTPMessageConverter

1.引入处理yaml的依赖

    com.fasterxml.jackson.dataformat    jackson-dataformat-yaml2.新增一种媒体类型yaml

配置如下
# 新增一种媒体类型yaml# 媒体类型的名字可以自定义# 媒体类型的名字是yaml媒体类型的值是text/yamlspring.mvc.contentnegotiation.media-types.yaml=text/yaml3.自定义HttpMessageConverter

// 专门处理yaml数据的消息转换器// 所有的消息转换器必须实现HttpMessageConverter接口,或者继承AbstrcatHttpMessageConverter抽象类public class YamlHttpMessageConverter extends AbstractHttpMessageConverter {    // 对象映射器    private ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory().disable(YAML.Feature.WRITE_DOC_START_MARKER));    // 将媒体类型text/yaml和application/x-yaml与此消息转换器关联起来    public YamlHttpMessageConverter() {      super(new MediaType("text", "yaml", Charset.forName("UTF-8")));    }    // 指定此消息转换器适合哪些类型的对象    @Override    protected boolean supports(Class clazz) {      // 只有User对象才能使用此消息转换器      return User.class.isAssignableFrom(clazz);    }    // 将yaml格式字符串转换成Java对象    // @RequestBody    @Override    protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {      return null;    }    // 将Java对象转换成yaml格式字符串    // @ResponseBody    @Override    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {      objectMapper.writeValue(outputMessage.getBody(), o);    }}4.配置消息转换器

// 添加这个注解后,表示不再使用springboot提供的默认配置// @EnableWebMvc@Configurationpublic class WebConfig implements WebMvcConfigurer {//    将新的消息转换器进行配置    @Override    public void configureMessageConverters(List

撵延兵 发表于 2026-2-2 04:52:25

用心讨论,共获提升!

国语诗 发表于 2026-2-2 08:15:33

不错,里面软件多更新就更好了

习和璧 发表于 2026-2-8 17:31:10

yyds。多谢分享

伏滢 发表于 2026-2-11 03:01:12

收藏一下   不知道什么时候能用到

忙贬 发表于 2026-2-11 04:11:35

过来提前占个楼

幽淆 发表于 2026-2-11 13:55:50

热心回复!

宛蛲 发表于 2026-2-13 16:39:16

新版吗?好像是停更了吧。

印萍 发表于 2026-2-13 19:37:30

懂技术并乐意极积无私分享的人越来越少。珍惜

申屠梓彤 发表于 2026-2-17 07:00:58

过来提前占个楼

浅皮懔 发表于 2026-2-26 06:18:09

不错,里面软件多更新就更好了

粹脍誊 发表于 2026-2-26 06:46:52

东西不错很实用谢谢分享

煅汾付 发表于 2026-2-26 13:31:14

谢谢楼主提供!

倡粤 发表于 2026-3-8 04:24:32

新版吗?好像是停更了吧。

勺缓曜 发表于 2026-3-8 10:57:38

谢谢楼主提供!

蝙俚 发表于 2026-3-9 21:28:23

这个有用。

麓吆 发表于 2026-3-10 19:42:22

感谢分享,学习下。

巨耗 发表于 2026-3-11 11:04:17

感谢发布原创作品,程序园因你更精彩
页: [1]
查看完整版本: spring boot--内容协商