项目场景:
项目场景:需要将JavaBean序列化为首字母大写传入Redis,供给前端使用WebSocket取值
问题描述
因为需要将前端序列化为大写字母,所以直接在JavaBean属性上直接加了@JsonProperty,但是序列化的时候发现重复字段。
@Data
public class ScadaDO implements Serializable {
private static final long serialVersionUID = 5703710525986968538L;
@JsonProperty("PressureSensorFailure")
private String pressureSensorFailure;
@JsonProperty("DiagnosticResults")
private String diagnosticResults;
@JsonProperty("AMSAlarmDescription")
private String amsAlarmDescription;
@JsonProperty("AMSAlarmType")
private String amsAlarmType;
@JsonProperty("AMSAlarmTime")
private String amsAlarmTime;
@JsonProperty("SetValue")
private String setValue;
@JsonProperty("ActualValue")
private String actualValue;
@JsonProperty("PSupplyPressureHighAlertPiont")
private String pSupplyPressureHighAlertPiont;
}
打印:{“diagnosticResults”:null,“psupplyPressureHighAlertPiont”:null,“amsalarmDescription”:null,“pressureSensorFailure”:null,“amsalarmTime”:null,“actualValue”:null,“setValue”:null,“amsalarmType”:null,“PressureSensorFailure”:null,“DiagnosticResults”:null,“AMSAlarmDescription”:null,“AMSAlarmType”:null,“AMSAlarmTime”:null,“SetValue”:null,“ActualValue”:null,“PSupplyPressureHighAlertPiont”:null}
原因分析:
因为在序列化时默认会找get方法,上面加着@Data注解,默认生成了get方法。所以如果没进行更多的配置就相当于序列化了两次
解决方案:
1:去掉get方法
2:加配置如下
@Data
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE)
public class ScadaDO implements Serializable {
private static final long serialVersionUID = 5703710525986968538L;
@JsonProperty("PressureSensorFailure")
private String pressureSensorFailure;
@JsonProperty("DiagnosticResults")
private String diagnosticResults;
@JsonProperty("AMSAlarmDescription")
private String amsAlarmDescription;
@JsonProperty("AMSAlarmType")
private String amsAlarmType;
@JsonProperty("AMSAlarmTime")
private String amsAlarmTime;
@JsonProperty("SetValue")
private String setValue;
@JsonProperty("ActualValue")
private String actualValue;
@JsonProperty("PSupplyPressureHighAlertPiont")
private String pSupplyPressureHighAlertPiont;
}
设置@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE)属性取消 Getxxx方法自动检测
打印如下:
{“PressureSensorFailure”:null,“DiagnosticResults”:null,“AMSAlarmDescription”:null,“AMSAlarmType”:null,“AMSAlarmTime”:null,“SetValue”:null,“ActualValue”:null,“PSupplyPressureHighAlertPiont”:null}
这就ok了