SpringBoot 接口入参和出参中不同格式转换

1. 背景

在实际的开发过程中,作为 SpringBoot 这样的服务端来说,经常需要与其他的第三方服务端交互,这交互的过程中,难免就会有不同标准的语言,每一种语言都有其遵循的命名规则,如:

  1. Java 语言中通常使用驼峰的命名规则;
  2. Python 语言通常使用下划线的命名规则;
  3. Go 语言中虽使用驼峰命名规则,但是还是要区分大驼峰和小驼峰;
  4. 。。。

为了使在程序内部使用同一套的命名规则,需要在接口的出参和入参处,做一层转换。

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 注解