问题
~~~
实体类使用@lombok.Builder注解和自己手动编写的全参构造方法,构建实体类实例时部分字段值发生了错乱。
~~~
代码
实体类【注意构造参数的顺序】
@Data
@Builder
@ApiModel(description = "二维平面统计图返回数据封装")
public class TwoDimensionalPlaneDTO implements Serializable {
@ApiModelProperty(hidden = true)
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "图例名称")
private String name;
@ApiModelProperty(value = "统计数据")
private String value;
public TwoDimensionalPlaneDTO(String value,String name){
this.name=name;
this.value=value;
}
}
业务层
public List<TwoDimensionalPlaneDTO> tranCargoRealTimeInfo() {
List<TwoDimensionalPlaneDTO> list = new ArrayList<>();
//使用builder ,参数错乱
list.add(TwoDimensionalPlaneDTO.builder().name("2类").value(Optional.ofNullable(reportDataManager.getDataByCond("data_int01","1000000243",null,"dim_char01","2类")).orElse("0")).build());
//调用构造方法,顺序正常
list.add(new TwoDimensionalPlaneDTO(Optional.ofNullable(reportDataManager.getDataByCond("data_int01","1000000243",null,"dim_char01","2类")).orElse("0"),"2类"));
return list;
}
结果对比:
怀疑
~~~
@Builder 注解,在生成静态内部类后,会调用有参构造
~~~
实体类,反编译后的代码
package com.ls.uem.emer.vis.dal.dto.result;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@ApiModel(description = ")
public class TwoDimensionalPlaneDTO implements Serializable {
@ApiModelProperty(hidden = true)
private static final long serialVersionUID = 1L;
@ApiModelProperty(")
private String name;
@ApiModelProperty(")
private String value;
public void setName(String name) {
this.name = name;
}
public void setValue(String value) {
this.value = value;
}
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof TwoDimensionalPlaneDTO))
return false;
TwoDimensionalPlaneDTO other = (TwoDimensionalPlaneDTO)o;
if (!other.canEqual(this))
return false;
Object this$name = getName(), other$name = other.getName();
if ((this$name == null) ? (other$name != null) : !this$name.equals(other$name))
return false;
Object this$value = getValue(), other$value = other.getValue();
return !((this$value == null) ? (other$value != null) : !this$value.equals(other$value));
}
protected boolean canEqual(Object other) {
return other instanceof TwoDimensionalPlaneDTO;
}
public int hashCode() {
int PRIME = 59;
result = 1;
Object $name = getName();
result = result * 59 + (($name == null) ? 43 : $name.hashCode());
Object $value = getValue();
return result * 59 + (($value == null) ? 43 : $value.hashCode());
}
public String toString() {
return "TwoDimensionalPlaneDTO(name=" + getName() + ", value=" + getValue() + ")";
}
public static TwoDimensionalPlaneDTOBuilder builder() {
return new TwoDimensionalPlaneDTOBuilder();
}
// 生成的静态内部类
public static class TwoDimensionalPlaneDTOBuilder {
private String name;
private String value;
public TwoDimensionalPlaneDTOBuilder name(String name) {
this.name = name;
return this;
}
public TwoDimensionalPlaneDTOBuilder value(String value) {
this.value = value;
return this;
}
// 问题 所在
public TwoDimensionalPlaneDTO build() {
//调用有参构造,但是参数顺没传对。
return new TwoDimensionalPlaneDTO(this.name, this.value);
}
public String toString() {
return "TwoDimensionalPlaneDTO.TwoDimensionalPlaneDTOBuilder(name=" + this.name + ", value=" + this.value + ")";
}
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
public TwoDimensionalPlaneDTO(String value, String name) {
this.name = name;
this.value = value;
}
}
~~~
OK ! 问题已发现。解决办法的话,首先看改实体类是否方便,如果别人也用到这个类,介意还是不要动了,可以选择用构造方法复制【没必要用builder构建了】。如果没有人用到的话,可以将构造方法的参数顺序调整正确就好了。
== 感谢原博主@青春不下线Eflying。原文地址:https://blog.csdn.net/Eflyings/article/details/108620746
~~~