• Java审计对比工具JaVers使用


            最近有个需求,需要将页面的内容生成excel或者word文档,而且每次的修改都需要生成新的版本,同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象,同时存储到数据库一条新数据,对应数据表一行数据记录。有个功能需要每次对比两个任意版本的数据,前端传递两个不同的版本号参数和其他对应的文档id参数,然后后端对应查出来这两行数据,一种方法是,将两条数据,转换成json字符串返回给前端,前端去对比两个字符串的不同的地方,然后高亮对比展示在页面。其实也可以后端去作对比,将变化的内容和两条数据一起返回,这样前端你可以直接按照后端返回的对比内容,去高亮显示两次修改的不同。

               现在模拟这种情况,比如是修改一个user的数据,第一次创建时候是1.0.0版本,然后又再次修改了一些字段的内容,提交后,形成一条新纪录,版本1.0.1版本,现在直接创建两个user对象,就当是从数据库中根据一定条件加上版本号限制查出来的两条数据。

             JaVers的官网:https://javers.org/

             首先,引入需要的基础Maven依赖:

    1. <dependency>
    2. <groupId>com.alibaba.fastjson2groupId>
    3. <artifactId>fastjson2artifactId>
    4. <version>2.0.43version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.google.guavagroupId>
    8. <artifactId>guavaartifactId>
    9. <version>31.1-jreversion>
    10. dependency>

    然后写个测试方法,模拟这种场景

    1. import com.alibaba.fastjson2.JSONArray;
    2. import lombok.Data;
    3. import org.apache.commons.lang3.StringUtils;
    4. import org.javers.core.Javers;
    5. import org.javers.core.JaversBuilder;
    6. import org.javers.core.diff.Change;
    7. import org.javers.core.diff.Diff;
    8. import java.util.List;
    9. /**
    10. * @author xiaomifeng1010
    11. * @version 1.0
    12. * @date: 2024-10-24 17:04
    13. * @Description
    14. */
    15. public class DiffCompareTest {
    16. public static void main(String[] args) {
    17. // 模拟从数据库中查出来了两条数据
    18. User user1 = new User();
    19. user1.setName("张三");
    20. user1.setAge(18);
    21. user1.setAddress("北京");
    22. user1.setPhone("123456789");
    23. user1.setEmail("123456789@qq.com");
    24. user1.setPassword("123456789");
    25. user1.setVersion("1.0.0");
    26. User user2 = new User();
    27. user2.setName("李四");
    28. user2.setAge(18);
    29. user2.setAddress("广州");
    30. user2.setPhone("123456789");
    31. user2.setEmail("123456789@qq.com");
    32. user2.setPassword("dfjdgdg");
    33. user2.setVersion("1.0.1");
    34. Javers javers = JaversBuilder.javers().build();
    35. Diff diff = javers.compare(user1, user2);
    36. System.out.println("对比:"+diff);
    37. List changes = diff.getChanges();
    38. System.out.println("变化:"+changes);
    39. // 转换成json数组字符串
    40. StringBuilder stringBuilder = new StringBuilder();
    41. stringBuilder.append("[");
    42. for (Change change : changes) {
    43. String valueChange = change.toString().replace("ValueChange", "");
    44. stringBuilder.append(valueChange);
    45. System.out.println("每一项的变化:"+change);
    46. }
    47. stringBuilder.append("]");
    48. String jsonArrayStr = stringBuilder.toString();
    49. // 打印转换之后的json数组字符串
    50. System.out.println("json数组:"+jsonArrayStr);
    51. // 或者赋值给一个java对象
    52. if (StringUtils.isNotBlank(jsonArrayStr)) {
    53. JSONArray jsonArray = JSONArray.parseArray(jsonArrayStr);
    54. List diffChanges = jsonArray.toJavaList(DiffChange.class);
    55. System.out.println("转换后的对象:"+diffChanges);
    56. }
    57. }
    58. }
    59. @Data
    60. class User {
    61. private String name;
    62. private Integer age;
    63. private String address;
    64. private String phone;
    65. private String email;
    66. private String password;
    67. private String version;
    68. }
    69. @Data
    70. class DiffChange{
    71. private String property;
    72. private String left;
    73. private String right;
    74. }

     在实际项目中,数据中是从数据中查询出来的,同时也是通过controller中的接口返回给前端的json数据,根据情况,组合java对象,返回给前端就可以了。

    这个示例的运行输出内容如下:

    非常好用,而且这个javers开源框架还有对应的各种数据库的审计工具;可以在Maven中央仓库中找到:

     

  • 相关阅读:
    tensorflow代码翻译成pytorch代码 -详细教程+案例
    go每日一题——内嵌,json.Marshal函数
    达人评测 i7 12800hx和i9 12900h选哪个好
    计算机网络之应用层面试题
    web安全-原发抗抵赖
    【autodesk】浏览器中渲染rvt模型
    Windows环境VSCode配置OpenCV-项目配置(二)
    如何将项目部署到服务器上(全套教程)
    基于STM32结合CubeMX学习Free-RT-OS的源码之深入学习软件定时器实现过程
    装饰器模式和 AOP 面向切片编程(设计模式与开发实践 P15)
  • 原文地址:https://blog.csdn.net/u011174699/article/details/143245823