SpringBoot3内容协商: 返回值Json、XML、YAML类型
Gitee: SpringBoot: SpringBoot3新特性
GitHub: GitHub - quackmytht/SpringBoot: SpringBoot3新特性
系统环境: Windows11
开发环境: jdk17(version: Kona17)、maven(version: 3.6.3)
框架版本: SpringBoot(version: 3.1.3)
根据自己需要填写好内容点击Next
选择完必要依赖点击Create; 进入项目启动主类进行启动测试.
创建必要包目录
创建测试
User
实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
/**
* ID
*/
private Long id;
/**
* 用户名
*/
private String username;
/**
* 年龄
*/
private Integer age;
/**
* 性别
*/
private String sex;
/**
* 电话
*/
private Integer telephone;
/**
* 邮箱
*/
private String email;
/**
* 地址
*/
private String address;
}
创建
UserController
接口测试类; 此处的R
中的 R 为统一返回值约束类, 可以不创建, 根据自己需求来; 也可以去文档顶部的git地址查看本文具体代码;R类位于common module
的com.tht.utils
包
@RestController
@RequestMapping
public class UserController {
@GetMapping
public R<User> getUser() {
return R.ok(new User(1L, "Jack", 16, "man", 123456, "[email protected]", "LianJiaTun"));
}
}
启动测试
启动项目进行测试; 访问
127.0.0.1:8080
; 结果如下(格式化JSON类型返回值chrome插件: JSON Formatter)
Chrome商店插件地址(需要科学上网): Chrome 应用商店 - JSON Formatter
国内平替: JSON Viewer_2.0.0_chrome扩展插件下载_极简插件
pom.xml添加依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformatgroupId>
<artifactId>jackson-dataformat-xmlartifactId>
dependency>
配置application.yml
spring:
mvc:
contentnegotiation:
# 开启基于请求参数的内容协商功能
favor-parameter: true
# 修改内容协商使用的参数名。默认是format
parameter-name: type
重启项目进行测试; 需要使用请求工具; 添加==请求头(Header)==信息Accept
:application/xml
注: 如果不生效或访问错误解决办法
在SpringBoot 3.0.0版本到 3.1.3版本中; 3.1.3版本不需要添加实体类注解, 但是如果使用版本早于教程版本, 导致结果不生效, 实体类添加注解@JacksonXmlRootElement
添加
yaml(yml)
返回值类型组件
public class YamlHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
public YamlHttpMessageConverter() {
super(new MediaType("application", "yaml", StandardCharsets.UTF_8));
}
/**
* 可以根据实际需求具体优化, 判断返回值类型 clazz 是否需要被转换成yaml格式
* @param clazz the class to test for support
* @return 此类型是否触发转换器
*/
@Override
protected boolean supports(Class<?> clazz) {
return true;
}
@Override
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
@Override
protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
YAMLFactory factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
ObjectMapper objectMapper = new ObjectMapper(factory);
try(OutputStream body = outputMessage.getBody()) {
objectMapper.writeValue(body, o);
}
}
}
配置自定义返回值类型
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new YamlHttpMessageConverter());
}
}
yml文件添加
media-types
配置; 全部配置如下
spring:
mvc:
contentnegotiation:
# 开启基于请求参数的内容协商功能
favor-parameter: true
# 修改内容协商使用的参数名。默认是format
parameter-name: type
media-types:
yaml: application/yaml
访问测试