记录:@JSONField和@JsonProperty和@ApiModelProperty一起使用,swagger显示不正常

@JSONField(name = "C-API-Status")
@JsonProperty("C-API-Status")
@ApiModelProperty(value = "响应码")    
private String CApiStatus;

@JSONField(name = "C-Response-Code")
@JsonProperty("C-Response-Code")
@ApiModelProperty(value = "888888")
private String CResponseCode;

@JSONField(name = "C-Response-Desc")
@JsonProperty("C-Response-Desc")
@ApiModelProperty(value = "响应信息")
private String CResponseDesc;

@JSONField(name = "C-Response-Body")
@JsonProperty("C-Response-Body")
@ApiModelProperty(value = "响应数据")
private String CResponseBody;

按理而言,应该不会有问题,结果打开,显示如下:

一看,什么鬼?查阅资料,得知:

jackson2对POJO类型(没有遵循特定的java对象模型,约定或者框架的对象)序列化处理流程:

Jackson2在初始化序列器时,在收集POJO类型对象的属性信息,属性包括成员变量及方法时,会将属性名称和处理后的方法名称作为key保存到LinkedHashMap中。收集过程当中会调用com.fasterxml.jackson.databind.util.BeanUtil中的legacyManglePropertyName方法用来处理方法名称,它会将get/set方法前缀,即get或set去掉,并将其后面的连续大写字符转换成小写字符返回。例如: getCApiStatus会转变成capistatus返回。

所以,jackson2对POJO类型进行处理,因为名称不冲突能够同时存在HashMap中。收集完属性信息后,后续步骤中会删除掉非可见的属性(私有成员变量),swagger中就不会显示,但因为@JsonProperty注释,Jackson2会认为这个属性是可见的,不会删除,这时这两个表示同一个值的属性就会被一同序列化。

知道了原因,修改起来就方便了,结合以上知识点:
1.jackson默认序列化时只去get和set方法的字段,私有字段不参与序列化。
2.@JsonProperty 注解在私有属性上,标明该私有字段在序列化时可见,另外能够指定序列化的名称。

解决办法:

@JsonProperty 标注在get set方法上(get set方法手写)