1. 背景
在实际的开发过程中,作为 SpringBoot 这样的服务端来说,经常需要与其他的第三方服务端交互,这交互的过程中,难免就会有不同标准的语言,每一种语言都有其遵循的命名规则,如:
- Java 语言中通常使用驼峰的命名规则;
- Python 语言通常使用下划线的命名规则;
- Go 语言中虽使用驼峰命名规则,但是还是要区分大驼峰和小驼峰;
- 。。。
为了使在程序内部使用同一套的命名规则,需要在接口的出参和入参处,做一层转换。
2. 常用的方法
2.1. 全局配置
在配置文件 application.properties 中增加配置:
spring.jackson.property-naming-strategy=SNAKE_CASE
假设输入的类为:
@Data
@AllArgsConstructor
public class User {
private String userName;
private String userGender;
private int userAge;
}
输出的类为:
@Data
@AllArgsConstructor
public class UserAdd {
private String userName;
private String userGender;
private int userAge;
private boolean userCheck;
}
此时,写接口的控制类:
@RestController
public class DemoRequest {
@PostMapping("user_info")
public UserAdd userInfo(@RequestBody User user) {
System.out.println(user.toString());
UserAdd userAdd = new UserAdd(user.getUserName(),
user.getUserGender(),
user.getUserAge(),
true);
return userAdd;
}
}
注意:在这里只为演示,一般不在控制类中 new 一个对象。
此时,我们请求的请求数据为:
{
"user_name": "felix",
"user_gender": "male",
"user_age": 35
}
输出为:
{
"user_name": "felix",
"user_gender": "male",
"user_age": 35,
"user_check": true
}
2.2. 局部控制
全局控制的情况下,每一个接口都会被转换,假设此时就只有部分的接口需要转换,此时就需要使用 @JsonProperty 注解。@JsonProperty 是 Jackson 提供的注解。
输入类为:
@Data
@AllArgsConstructor
public class User {
private String name;
private String gender;
@JsonProperty("user_age")
private int userAge;
}
输出类为:
@Data
@AllArgsConstructor
public class UserAdd {
@JsonProperty("user_name")
private String userName;
@JsonProperty("user_gender")
private String userGender;
@JsonProperty("user_age")
private int userAge;
@JsonProperty("user_check")
private boolean userCheck;
}
局部控制的优势就是按需配置。
2.3. 扩展
如果是使用 HttpServletRequest 类来接收用户的请求,可以直接使用 ObjectMapper 类的 readValue() 方法,具体代码如下:
@PostMapping("user_info")
public void userInfo(HttpServletRequest httpServletRequest) throws IOException {
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(httpServletRequest.getInputStream(), User.class);
System.out.println(user.toString());
}
3. 总结
在 SpringBoot 中要实现不同格式的出参和入参的转换,可以使用全局配置和局部配置的方法:
- 全局配置:在配置文件中增加
spring.jackson.property-naming-strategy=SNAKE_CASE - 局部配置:使用
@JsonProperty注解