乳杂丫 发表于 2026-1-28 06:00:50

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:10:48

谢谢楼主提供!

公新蕾 发表于 2026-2-8 06:26:04

yyds。多谢分享

彭水晶 发表于 2026-2-8 19:14:11

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

师佳思 发表于 2026-2-9 04:58:58

谢谢分享,辛苦了

简千叶 发表于 2026-2-9 07:07:21

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

旁拮猾 发表于 2026-2-9 18:34:56

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

吉娅寿 发表于 2026-2-10 10:22:15

分享、互助 让互联网精神温暖你我

裆趾针 发表于 2026-2-10 10:33:12

前排留名,哈哈哈

痕厄 发表于 2026-2-10 19:55:51

很好很强大我过来先占个楼 待编辑

蔓好 发表于 2026-2-11 15:45:04

谢谢楼主提供!

骆贵 发表于 2026-2-12 09:39:33

鼓励转贴优秀软件安全工具和文档!

陆菊 发表于 2026-2-12 13:57:19

这个有用。

命煦砌 发表于 2026-2-13 12:33:47

过来提前占个楼

普料飕 发表于 2026-2-21 07:33:27

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

卓卞恻 发表于 2026-2-26 19:17:23

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

官厌 发表于 2026-2-28 08:18:23

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

晾棋砷 发表于 2026-3-9 21:24:11

用心讨论,共获提升!

澹台忆然 发表于 2026-3-10 17:08:09

这个好,看起来很实用

党新苗 发表于 3 天前

喜欢鼓捣这些软件,现在用得少,谢谢分享!
页: [1]
查看完整版本: spring boot--内容协商