public static <T> DifferenceResult diff(T oldInstance, T newInstance) { LOGGER.debug("start to diff. oldInstance:{},newInstance:{}", oldInstance, newInstance); Preconditions.checkNotNull(oldInstance, "oldInstance is null"); Preconditions.checkNotNull(newInstance, "newInstance is null"); Stopwatch sw = Stopwatch.createStarted(); // given Javers javers = JaversBuilder.javers().build(); // when Diff diff = javers.compare(oldInstance, newInstance); List<ValueChange> changes = diff.getChangesByType(ValueChange.class); if (CollectionUtils.isEmpty(changes)) { LOGGER.debug("diff. nothing changed. oldInstance:{},newInstance:{}", oldInstance, newInstance); return DifferenceResult.builder().withDiff(false).withMessage(StringUtils.EMPTY).build(); } String message = changes.stream().map(change -> { Object leftMsg = formatDate(change.getLeft()); Object rightMsg = formatDate(change.getRight()); return String.format("%s:[%s]->[%s]", change.getPropertyName(), leftMsg, rightMsg); }).collect(Collectors.joining(",")); DifferenceResult result = DifferenceResult.builder().withDiff(true).withMessage(message).build(); LOGGER.debug("diff. {} changed. it consume {}. oldInstance:{},newInstance:{}", result, sw, oldInstance, newInstance); return result; }
如果要忽略一些字段的比较,可以采用下面的注解的方式:
@DiffIgnore private Date modifiedTime; @DiffIgnore private Date createTime;
javers: https://javers.org/documentation/diff-examples/#compare-entities
参考: https://www.baeldung.com/javers
一个简单的方法:
下面的是简单示例:
public class JaVers { /** * @param args * @author kanpiaoxue * @CreateTime: 2020/04/20 17:09:05 * @Description: */ public static void main(String[] args) { // given Javers javers = JaversBuilder.javers().build(); SimplePerson oldPerson = SimplePerson.builder().withId(1).withName("hello").build(); SimplePerson newPerson = SimplePerson.builder().withId(1).withName("hello1").build(); // when Diff diff = javers.compare(oldPerson, newPerson); // then List<ValueChange> changes = diff.getChangesByType(ValueChange.class); System.out.println(changes); // output: [ValueChange{ 'name' value changed from 'hello' to 'hello1' // }] changes.stream().forEach(change -> { System.out.println(change.prettyPrint(PrettyValuePrinter.getDefault())); System.out.println(String.format("%s:%s->%s", change.getPropertyName(), change.getLeft(), change.getRight())); // name:hello->hello1 }); } }
public class SimplePerson { /** * Builder to build {@link SimplePerson}. */ public static final class Builder { private Integer id; private String name; private Builder() { } /** * Builder method of the builder. * * @return built class */ public SimplePerson build() { return new SimplePerson(this); } /** * Builder method for id parameter. * * @param id * field to set * @return builder */ public Builder withId(Integer id) { this.id = id; return this; } /** * Builder method for name parameter. * * @param name * field to set * @return builder */ public Builder withName(String name) { this.name = name; return this; } } private Integer id; private String name; /** * */ public SimplePerson() { super(); } private SimplePerson(Builder builder) { this.id = builder.id; this.name = builder.name; } /** * Creates builder to build {@link SimplePerson}. * * @return created builder */ public static Builder builder() { return new Builder(); } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } SimplePerson other = (SimplePerson) obj; if (id == null) { if (other.id != null) { return false; } } else if (!id.equals(other.id)) { return false; } if (name == null) { if (other.name != null) { return false; } } else if (!name.equals(other.name)) { return false; } return true; } /** * @return the id */ public Integer getId() { return id; } /** * @return the name */ public String getName() { return name; } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } /** * @param id * the id to set */ public void setId(Integer id) { this.id = id; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "SimplePerson [id=" + id + ", name=" + name + "]"; } }
public class DifferenceResult { /** * Builder to build {@link DifferenceResult}. */ public static final class Builder { private boolean diff; private String message; private Builder() { } /** * Builder method of the builder. * * @return built class */ public DifferenceResult build() { return new DifferenceResult(this); } /** * Builder method for diff parameter. * * @param diff * field to set * @return builder */ public Builder withDiff(boolean diff) { this.diff = diff; return this; } /** * Builder method for message parameter. * * @param message * field to set * @return builder */ public Builder withMessage(String message) { this.message = message; return this; } } private boolean diff; private String message; /** * */ public DifferenceResult() { super(); } private DifferenceResult(Builder builder) { this.diff = builder.diff; this.message = builder.message; } /** * Creates builder to build {@link DifferenceResult}. * * @return created builder */ public static Builder builder() { return new Builder(); } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } DifferenceResult other = (DifferenceResult) obj; if (diff != other.diff) { return false; } if (message == null) { if (other.message != null) { return false; } } else if (!message.equals(other.message)) { return false; } return true; } /** * @return the message */ public String getMessage() { return message; } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (diff ? 1231 : 1237); result = prime * result + ((message == null) ? 0 : message.hashCode()); return result; } /** * @return the diff */ public boolean isDiff() { return diff; } /** * @param diff * the diff to set */ public void setDiff(boolean diff) { this.diff = diff; } /** * @param message * the message to set */ public void setMessage(String message) { this.message = message; } /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return CommonUtils.toJSONString(this); } }
相关推荐
Java文件对比工具是一种用于比较两个或多个文件之间差异的实用程序,特别适用于编程环境中检查代码间的相似性或差异。在Java开发中,这样的工具能够帮助开发者有效地定位代码修改的地方,协同工作时解决合并冲突,...
标题中的“实用小工具:Java实体类对比、Json对比、字符串动态拼接等功能”涉及到的是在软件开发过程中常用的几个技术点,主要集中在Java后端和前端Vue.js的应用上。这里我们将详细探讨这些知识点: 1. **Java实体...
这两个工具使得在XML和Java对象之间进行序列化和反序列化变得更加简单。 以下是一个简单的示例,展示了如何使用`ObjectToXMLUtil`工具类将Java对象序列化到XML文件以及从XML文件中反序列化: ```java public class...
总的来说,“对象字段变化比较工具”是一个实用的开发辅助工具,它简化了对象状态对比的过程,帮助开发者更高效地定位和解决问题。通过理解其核心原理和技术细节,我们可以更好地利用它来提升工作效率。
Java对比工具是一款专门用于比较Java源代码文件差异的实用程序,它可以帮助开发者高效地识别和理解两个版本之间代码的修改之处。在这个分享中,我们主要关注的是"Bcompare-zh-3.3.10.17762.exe"这个文件,这是一款名...
总之,"castor插件java对象和XML自动绑定mapping文件生成和java对象一键生成工具1.2"是提升XML处理效率的利器,它简化了Java和XML之间的交互,使得开发过程更为流畅。X2MUTIL可能是该工具包的主程序或执行文件,用于...
`ObjectCompareUtil.java`很可能就是一个工具类,提供了静态方法来比较两个对象的属性差异。 在`ObjectCompareUtil`中,可能会有如下的核心方法: ```java public static <T> Map, DiffResult> compareObjects(T ...
可能包含的方法有`toJson()`(将Java对象转换为JSON字符串)、`fromJson()`(将JSON字符串解析为Java对象)、`convertToMap()`(将JSON字符串转换为Map)以及`convertToList()`(将JSON字符串转换为List)等。...
这些工具可以将Java对象序列化为CSV或Excel格式,反之亦然,使得数据交换变得更加方便。 在实际开发中,将Excel或CSV数据转化为Java对象集合通常涉及到以下步骤: 1. **读取文件**:使用Apache POI或CSV库打开并...
综上所述,"java转js工具"是一个重要的开发辅助工具,它帮助开发者在Java和JavaScript之间架起桥梁,使得跨平台开发变得更加便捷。然而,使用时需要注意语言特性的差异,以及转换过程中可能出现的问题和挑战。
xml报文和java对象互相转换 相关jar包和测试代码,可以与castor插件java对象和XML自动绑定maping文件生成和java对象一键生成工具1.2(https://download.csdn.net/download/kemoing/10864595)完美配合使用
根据官网和网上分享的代码自己整理了一个阿里云OSS工具类,自动创建标准公开权限的存储空间,支持上传图片,音频,视频,PDF各种文件,批量上传,上传后支持在线预览,文件路径处理,浏览器文件下载(支持源文件中文...
java 判断对象是否为空.如String,Character,Object[]
Java使用类和对象来组织代码,而Python则支持多种面向对象的特性,包括类、对象、以及函数式编程元素。此外,Java的控制流程(如if-else,for循环)和异常处理与Python也有所不同。 在实际的转换过程中,工具可能会...
Jockey跟其他混淆工具不同的是:它是直接对编译过程做文章,也就是在把java文件编译为class文件的过程中对代码进行混淆,混淆后的代码中包含很多JVM 指令,大家知道JVM指令是面向机器的,人类一般很难看懂!...
java判空工具类 可以判断字符串数组,字符串类型,List对象集合,Map集合map,object>,map和多个String参数,对象类型,是否为空。 java判断对象属性是否全部为空,只要有一个属性不为空,那么就不是所有的属性值都...
3. **结构转换**:处理C++的类和对象到Java的类和对象的转换,包括构造函数、继承、多态等面向对象特性。 4. **异常处理**:将C++的错误处理机制(如返回错误码)转换为Java的异常处理机制。 5. **内存管理**:C++...
[工具类] CookieCounter .java.txt [工具类] 验证码img .jsp.txt [工具类] Java中计算任意两个日期之间的工作天数 .java.txt [工具类] java抓取网页 .java.txt [工具类] MD5 .java.txt [工具类] MD5强化版 .java.txt...
Java 面向对象编程练习题与答案 本资源摘要信息涵盖了 Java 面向对象编程的多个知识点,包括 Font 类、Toolkit 类、包机制、抽象类、数组操作等。 1. Font 类: Font 类是 Java 中的一个类,用于设置程序中的字体...