问题背景

最近因为发现有一个表字段被设计成u_name,然后用工具生产的实体的属性字段是uName,就是首字母是小写,第二个字母是大写的这类属性,然后我们关于这个字段的一个接口的请求对象VO中字段也是沿用的uName。
uname_field

然后postman测试提交数据的时候,json请求体中字段属性也是uName。
uname_field

我们这个项目是采用SpringBoot 2.1.5.RELEASE的,json序列化的工具是jackson,版本是2.9.8,这可能是jackson对于这类字段属性json序列号支持不太友好的地方。

解决方案

  1. 采用@JsonProperty注解给uName属性字段定义json字段别名.
    /**
    * 姓名
    */
    @JsonProperty("uName")
    private String uName;

  2. 给请求VO实体添加@JsonAutoDetect注解

    @Data
    @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)
    public class UserVO {

    /**
    - 姓名
    */
    private String uName;
    }

注解说明

@JsonAutoDetect

该注解的作用是配置自动识别的类型:

有以下四个属性:

  • getterVisibility:定义getter方法的识别范围。
  • isGetterVisibility:定义is-getter方法的识别范围(boolean类型的getter,很少用)。
  • setterVisibility:定义setter方法的识别范围。
  • creatorVisibility:定义构造器识别范围。
  • fieldVisibility:定义属性识别范围。
    识别范围是一个枚举,包括:
  • Visibility.ANY:表示从 private 到 public 修饰,都可识别。
  • Visibility.NON_PRIVATE:表示除 private 修饰不可识别,其他都识别。
  • Visibility.PROTECTED_AND_PUBLIC:protected 和 public都识别。
  • Visibility.PUBLIC_ONLY:仅 public 可见。
  • Visibility.NONE:所有皆不可见。
  • Visibility.DEFAULT:缺省,所有被 public 修饰的属性、 getter 和所有 setter皆可见。