当前位置: 首页 > article >正文

Java审计对比工具JaVers使用

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

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

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

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

<!-- 阿里JSON解析器 -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.43</version>
        </dependency>

       <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>

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

import com.alibaba.fastjson2.JSONArray;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.javers.core.Javers;
import org.javers.core.JaversBuilder;
import org.javers.core.diff.Change;
import org.javers.core.diff.Diff;

import java.util.List;

/**
 * @author xiaomifeng1010
 * @version 1.0
 * @date: 2024-10-24 17:04
 * @Description
 */
public class DiffCompareTest {

    public static void main(String[] args) {
//        模拟从数据库中查出来了两条数据
        User user1 = new User();
        user1.setName("张三");
        user1.setAge(18);
        user1.setAddress("北京");
        user1.setPhone("123456789");
        user1.setEmail("123456789@qq.com");
        user1.setPassword("123456789");
        user1.setVersion("1.0.0");
        User user2 = new User();
        user2.setName("李四");
        user2.setAge(18);
        user2.setAddress("广州");
        user2.setPhone("123456789");
        user2.setEmail("123456789@qq.com");
        user2.setPassword("dfjdgdg");
        user2.setVersion("1.0.1");

        Javers javers = JaversBuilder.javers().build();
        Diff diff = javers.compare(user1, user2);

        System.out.println("对比:"+diff);

        List<Change> changes = diff.getChanges();
        System.out.println("变化:"+changes);

//        转换成json数组字符串
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (Change change : changes) {
            String valueChange = change.toString().replace("ValueChange", "");
            stringBuilder.append(valueChange);
            System.out.println("每一项的变化:"+change);
        }
        stringBuilder.append("]");
        String jsonArrayStr = stringBuilder.toString();
//        打印转换之后的json数组字符串
        System.out.println("json数组:"+jsonArrayStr);
//        或者赋值给一个java对象
        if (StringUtils.isNotBlank(jsonArrayStr)) {
            JSONArray jsonArray = JSONArray.parseArray(jsonArrayStr);
            List<DiffChange> diffChanges = jsonArray.toJavaList(DiffChange.class);
            System.out.println("转换后的对象:"+diffChanges);
        }

    }
}

@Data
class User {
    private String name;
    private Integer age;
    private String address;
    private String phone;
    private String email;
    private String password;
    private String version;


}

@Data
class DiffChange{
    private String property;
    private String left;
    private String right;
}

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

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

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

 


http://www.kler.cn/news/366080.html

相关文章:

  • 理解深度学习模型——高级音频特征表示的分层理解
  • SMT 生产可视化:提升电子组装流程效率
  • JavaScript网页设计案例教程:从零开始构建一个响应式网页
  • 【永中软件-注册/登录安全分析报告】
  • 设计师的新宠:7款不容错过的界面设计软件
  • OpenCV与AI深度学习 | 实战 | OpenCV中更稳更快的找圆方法--EdgeDrawing使用演示(详细步骤 + 代码)
  • CentOS 7 安装gcc编译环境
  • 解决selenium打开浏览器自动退出
  • k8s 查看 Secrets 的内容和详细信息
  • LCD手机屏幕高精度贴合
  • 密集向量(Dense Vectors):最大化机器学习中数据的潜力
  • 什么是埋点测试,app埋点测试怎么做?
  • 24.10.25 人工智能基础 Pandas库 函数 学习笔记
  • Spring中的循环依赖
  • Android BUG 之 Program type already present: MTT.ThirdAppInfoNew
  • 生信软件39 - GATK最佳实践流程重构,提高17倍分析速度的LUSH流程
  • PyTorch 保存和加载模型状态和优化器状态
  • win10系统家庭版.net framework 3.5sp1启动错误如何解决
  • idea 集成maven
  • Maven(解决思路)
  • TCP标志位在网络故障排查中的作用
  • C语言与C++语言对比:为何C语言不支持函数重载而C++支持?
  • 【图论】Kruskal重构树
  • 《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 模块化基础篇》
  • golang中的函数和结构体
  • Android H5页面性能分析与优化策略