Java审计对比工具JaVers使用

news2024/10/27 14:46:06

        最近有个需求,需要将页面的内容生成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.coloradmin.cn/o/2224737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp圆形波浪进度效果

uniapp圆形波浪进度效果 背景实现思路代码实现尾巴 背景 最近项目中有些统计的地方需要用到圆形的波浪进度效果&#xff0c;要求是根据百分比值然后在一个圆形内动态的展示一个波浪形的进度&#xff0c;看参考一下效果。 实现思路 这个效果看着挺复杂的&#xff0c;那么我们…

android——渐变色

1、xml的方式实现渐变色 效果图&#xff1a; xml的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…

索引的使用和优化

索引就是一种快速查询和检索数据的数据结构&#xff0c;mysql中的索引结构有&#xff1a;B树和Hash。 索引的作用就相当于目录的作用&#xff0c;我么只需先去目录里面查找字的位置&#xff0c;然后回家诶翻到那一页就行了&#xff0c;这样查找非常快&#xff0c; 创建一个表结…

【数据结构】宜宾大学-计院-实验五

实验五 栈和队列&#xff08;队列的基本操作&#xff09; 实验目的&#xff1a;链表结点结构&#xff1a;实验结果&#xff1a;运行截图&#xff1a;代码实现&#xff1a; 实验目的&#xff1a; 1&#xff0e;掌握队列的顺序存储结构和链式存储结构 2&#xff0e;实现队列的基…

(北京政务服务满意度公司)满意度调查助力服务质量提升

在当今社会&#xff0c;&#xff08;政务服务满意度公司&#xff09;政务窗口服务的质量直接关系到市民的日常生活和城市的健康发展。为了解市民对政务窗口服务的满意度&#xff0c;提升服务质量&#xff0c;某市委托民安智库专业市场调查公司开展了政务窗口服务满意度调查&…

若依框架部署到服务器刷新或者是退出登录出现404

登出错误404 改成/登出的时候重定向到根路径&#xff0c;让nginx匹配去找dist目录下的index.html文件 或者是直接改为/index.html&#xff0c;少一步可能会快一点&#xff1f; 不过会变得很丑,算了还是根目录吧 原版是index&#xff0c;那玩意是 针对路由的&#xff0c;而打包…

【重生之我要苦学C语言】 函数递归

函数递归 什么是递归&#xff1f; 递归就是函数自己调用自己 递归一定是基于函数的 在任何一次函数调用中&#xff0c;都会申请资源&#xff0c;申请的是内存中栈区的资源 栈区的资源是有限的&#xff0c;因此函数不能无限次的递归 递归的思想 把一个大型复杂问题层层转化为…

解决docker拉取readeck镜像报Error response from daemon: toomanyrequests问题

readeck 是一个内容中心&#xff0c;目前已支持中文翻译 这是本地化部署后的效果&#xff1a; 原命令为&#xff1a; docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest Unable to find image codeberg.org/readeck/readeck:la…

数据库的诗篇:深入探索 MySQL 表操作的艺术与哲学

文章目录 前言&#x1f338;一、创建表——搭建数据存储的基础框架1.1 基本语法1.2 创建表的实际案例解释&#xff1a; 1.3 表设计的最佳实践 &#x1f338;二、查看表结构——快速了解数据库设计2.1 使用 DESC 命令解释&#xff1a; 2.2 使用 SHOW COLUMNS 命令2.3 使用 SHOW …

[MySQL#2] 库 | 表 | 详解CRUD命令 | 字符集 | 校验规则

目录 一. 库操作 1. 创建数据库 2. 字符集和校验规则 校验规则对数据库的影响 显示创建数据库时对应的命令 3. 修改数据库 4. 数据库删除 备份和恢复 还原 查看连接情况 二. 表操作 1. 创建表&#xff08;定义实例化格式 2. 创建表案例 &#xff08;实例化数据类型…

【Fargo】12:参考mediasoup 重构 udpsocket管理、定时器、uv生命周期

udp 发送的包是动态分配的内存,即使考虑rtppacket类型,也是动态分配的内存构造rtppacket,因此应该考虑对这块内存管理起来。之前的实现采用了一个固定分配的内存,可能会节省内存,固定大小虽然不够灵活,但是可以规避频繁分配导致的内存碎片。每次都动态分配一个uv_udp_sen…

vue3+vite 部署npm 包

公司需要所以研究了一下怎么部署安装&#xff0c;比较简单 先下载个vue项目 不用安准路由&#xff0c;pinna 啥的&#xff0c;只需要一个最简单的模版 删掉App.vue 中的其它组件 npm create vuelatest 开始写自定义组件 新建一个el-text 组件, name是重点&#xff0c;vue3中…

【10天速通Navigation2】(三) :Cartographer建图算法配置:从仿真到实车,从原理到实现

前言 往期内容&#xff1a; 第一期&#xff1a;【10天速通Navigation2】(一) 框架总览和概念解释第二期&#xff1a;【10天速通Navigation2】(二) &#xff1a;ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明 本教材将贯穿nav2的全部内容&#xff0c…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1&#xff0c;降级MySQL ODBC2.2 解决2&#xff0c;修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密…

双11必买物品清单有哪些?双11推荐购买清单分享

随着双11购物节的到来&#xff0c;这个由光棍节演变而来的全民狂欢节已经成为了中国乃至全球最大的在线购物盛事。对于精明的购物者来说&#xff0c;双11不仅是一个购物的好时机&#xff0c;更是一个精打细算、囤货备需的黄金时刻。那么双11必买物品清单有哪些&#xff1f;在这…

基于Arduino的LED亮灭按键控制

一、项目简介 通过一个按键控制LED的亮灭&#xff0c;实现按键按一下LED点亮&#xff0c;再按一下LED熄灭&#xff0c;交替循环。 二、控制原理 1. 按键检测原理&#xff1a; 将Arduino的监测端口设置为输入上拉模式&#xff08;INPUT_PULLUP&#xff09;&#xff0c;用于连…

C++结合图形编程与物联网:你更偏向哪种方式来学习信息学奥赛?

随着信息学奥赛在全国范围内的热度逐年攀升&#xff0c;学生和家长们越来越重视如何有效备赛。传统的编程学习方式侧重于算法和数据结构&#xff0c;但随着科技的发展&#xff0c;图形化编程与物联网&#xff08;IoT&#xff09;项目逐渐成为新兴的学习路径。通过C结合图形化编…

直播系统源码技术搭建部署流程及配置步骤

系统环境要求 PHP版本&#xff1a;5.6、7.3 Mysql版本&#xff1a;5.6&#xff0c;5.7需要关闭严格模式 Nginx&#xff1a;任何版本 Redis&#xff1a;需要给所有PHP版本安装Redis扩展&#xff0c;不需要设置Redis密码 最好使用面板安装&#xff1a;宝塔面板 - 简单好用的…

存储过程(SQL)

1.存储过程 存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中&#xff0c;用户通过指定存储过程的名字并给定参数&#xff08;如果该存储过程带有参数&#xff09;来调用执行它。 2.MySQL存储过程创建…