1. 依赖包
<dependency>
<groupId>de.danielbechler</groupId>
<artifactId>java-object-diff</artifactId>
<version>0.95</version>
</dependency>
2. 测试
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.alibaba.fastjson2.JSON;
import de.danielbechler.diff.ObjectDifferBuilder;
import de.danielbechler.diff.node.DiffNode;
// @RunWith(SpringRunner.class)
// @SpringBootTest(classes = SsmpScaffoldApplication.class)
public class TestObject {
@BeforeEach
public void setUp() {
}
@Test
public void compareObj() {
try {
SaveSysAdminUserRequest request1 = new SaveSysAdminUserRequest();
request1.setId(null);
request1.setUserName("admin");
request1.setPassword("888888");
request1.setEmail("admimn@163.com");
request1.setMobile("13599991123");
request1.setNickName("管理员");
request1.setGender(1);
request1.setStatus(1);
request1.setSort(1);
SaveSysAdminUserRequest request2 = new SaveSysAdminUserRequest();
request2.setId(11L);
request2.setUserName("system");
request2.setGender(2);
request2.setStatus(0);
request2.setSort(3);
DiffNode diffNode = ObjectDifferBuilder.buildDefault().compare(request1, request2);
List<ObjCompareResult> diffList = new ArrayList<>();
diffNode.visit((node, visit) -> {
final Object baseValue = node.canonicalGet(request1);
final Object workingValue = node.canonicalGet(request2);
// final String message = node.getPath() + " changed from " + baseValue + " to " + workingValue;
// System.out.println(message);
if (!"/".equals(node.getPath().toString())) {
// 属性
String field = node.getPath().toString();
if (StringUtils.isNotBlank(field) && field.startsWith("/")) {
field = field.substring(1);
}
ObjCompareResult result = new ObjCompareResult();
result.setObj("com.wjh.ssmpscaffold.ssmp.request.SaveSysAdminUserRequest");
result.setObjDesc("保存管理端用户 请求参数");
result.setField(field);
result.setOldValue(baseValue == null ? "" : baseValue.toString());
result.setNewValue(workingValue == null ? "" : workingValue.toString());
result.setModule("ssmp");
diffList.add(result);
}
});
System.out.println(JSON.toJSONString(diffList));
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 要测试的 JavaBean
import java.io.Serial;
import java.io.Serializable;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
public class SaveSysAdminUserRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1375192067610030189L;
@Schema(description = "用户id")
private Long id;
/** 登录账号 */
@Schema(description = "登录账号")
@NotBlank(message = "账号不能为空")
private String userName;
/** 密码 */
@Schema(description = "密码")
private String password;
/** 邮箱 */
@Schema(description = "邮箱")
private String email;
/** 手机号 */
@Schema(description = "手机号")
private String mobile;
/** 用户昵称 */
@Schema(description = "用户昵称")
@NotBlank(message = "昵称不能为空")
private String nickName;
/** 性别(0:所有, 1:男, 2:女) */
@Schema(description = "性别(0:所有, 1:男, 2:女)", example = "1")
@NotNull(message = "性别不能为空")
private Integer gender;
/** 头像地址 */
@Schema(description = "头像地址")
private String avatar;
/** 状态(0->禁用;1->启用) */
@Schema(description = "状态(0->禁用;1->启用)", example = "1")
private Integer status;
/** 排序 */
@Schema(description = "排序", example = "1")
private Integer sort;
}
4. 对象比较结果类
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* 对象值比较结果
*
* @author wenjianhai
* @date 2024/5/8
* @since JDK 17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
public class ObjCompareResult {
/** 对象 */
private String obj;
/** 对象描述 */
private String objDesc;
/** 对象属性 */
private String field;
/** 对象属性旧值 */
private String oldValue;
/** 对象属性新值 */
private String newValue;
/** 所属模块 */
private String module;
}