首页 > 其他分享 >springboot~jpa审计字段的自动填充

springboot~jpa审计字段的自动填充

时间:2024-05-30 13:55:19浏览次数:23  
标签:审计 springboot jpa AuditorAware class 字段 Optional public 请求

在使用 Spring Data JPA 中的 @CreatedDate 注解时,如果希望自动填充创建时间字段,通常需要结合 @EntityListeners(AuditingEntityListener.class) 注解一起使用。这是因为 @CreatedDate 等审计注解通常与审计事件监听器(AuditingEntityListener)一起工作,用于处理实体的审计信息。

审计字段-自动填充

当您定义一个实体类(例如 EntityBase)并希望使用 @CreatedDate 注解来自动设置创建时间时,可以按照以下步骤操作:

  1. 在实体类中添加 @CreatedDate 注解,实体可抽象成一个类,如EntityBase,AuditBase等
@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class EntityBase {

	/**
	 * 创建人
	 */
	@Column(name = "created_by")
	@CreatedBy
	private String createdBy;

	/**
	 * 修改人
	 */
	@Column(name = "updated_by")
	@LastModifiedBy
	private String updatedBy;

	/**
	 * 创建时间
	 */
	@Column(name = "created_time")
	@CreatedDate
	private java.time.LocalDateTime createdTime;

	/**
	 * 更新时间
	 */
	@Column(name = "update_time")
	@LastModifiedDate
	private java.time.LocalDateTime updateTime;

}
  1. 确保审计事件监听器生效
    确保 AuditingEntityListener 能够正确监听实体类的审计事件,并在保存实体对象时自动填充相应的审计信息,包括创建时间等。

  2. 实现AuditorAware接口,返回当前登录的用户,以便填充create_by字段,同时开启审计功能@EnableJpaAuditing:

@EnableJpaAuditing
@Component
public class AuditorAwareImpl implements AuditorAware {

	@Override
	public Optional getCurrentAuditor() {
		return Optional.of("lind");
	}

}

通过以上步骤,您可以在订阅 EntityBase 实体类时使用 @CreatedDate 注解,并结合 @EntityListeners(AuditingEntityListener.class) 注解来自动填充创建时间字段,从而实现审计功能。

AuditorAware获取请求头信息

要在实现 AuditorAware 接口的 getCurrentAuditor() 方法中获取当前请求头(HTTP Header)中的变量,您可以借助 Spring 提供的 RequestContextHolderServletRequestAttributes 来访问当前请求的上下文信息。具体步骤如下:

  1. 获取当前请求的 HttpServletRequest 对象

    • 首先,您需要从 RequestContextHolder.getRequestAttributes() 获取当前请求的 ServletRequestAttributes 对象。
    • 然后通过 ServletRequestAttributes 对象获取当前的 HttpServletRequest 对象。
  2. 从 HttpServletRequest 中获取请求头信息

    • HttpServletRequest 对象中,您可以使用 getHeader() 方法来获取指定名称的请求头信息。

下面是一个示例代码,演示了如何在 AuditorAwaregetCurrentAuditor() 方法中获取当前请求头中的变量:

import org.springframework.data.domain.AuditorAware;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Optional;

@EnableJpaAuditing
@Component
public class CustomAuditorAware implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            String customHeaderValue = request.getHeader("Custom-Header");
            return Optional.ofNullable(customHeaderValue);
        }
        return Optional.empty();
    }
}

如果是基于netty的WEB框架,需要使用下面代码获取请求头参数

@EnableJpaAuditing
@Component
public class AuditorAwareImpl implements AuditorAware<String> {

	@Override
	public Optional<String> getCurrentAuditor() {
		Object request = RpcContext.getServiceContext().getRequest();
		if (request != null) {
			NettyRequestFacade requestFacade = (NettyRequestFacade) request;
			if (requestFacade != null && requestFacade.getHeader("preferred_username") != null) {
				return Optional.of(requestFacade.getHeader("preferred_username"));
			}
		}
		return Optional.of("none");
	}

}

在上述代码中,我们通过 RequestContextHolder 获取当前请求的上下文信息,并从中提取出请求头中名为 Custom-Header 的自定义变量值。最后将该值作为审计人员信息返回。

请注意,在使用 RequestContextHolder 时,确保上下文中包含请求信息,否则可能会出现空指针异常。另外,这种方式适用于基于 Spring MVC 或 Spring WebFlux 的应用。

标签:审计,springboot,jpa,AuditorAware,class,字段,Optional,public,请求
From: https://www.cnblogs.com/lori/p/18222186

相关文章

  • 基于springboot+vue的家乡特色推荐系统
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示系统首页用户注册文章分享界面个人中心管理员登录管理员功能用户管理文章分类管理文章分享......
  • Java毕业设计-基于springboot开发的旅游网站-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、用户信息管理2、旅游动态管理3、景点信息管理4、公告信息管理四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的旅游网站-......
  • Springboot报class path resource [xxxxx.json] cannot be resolved to URL because i
    当Springboot解析resources文件下的json文件时,在本地环境好用,部署到服务器上找不到文件内容报错classpathresource[xxxxx.json]cannotberesolvedtoURLbecauseitdosenotexist问题排查(1)pom.xml文件配置<build><resources><resource><d......
  • 日常开发中注意点总结(三)对于分页查询、详情查询总到底哪些字段该回传回来,数据库的回传
    还有个问题,对于分页查询、详情查询这些接口中,到底是哪些字段应该回传给前台,其实还是依赖于前台需要对哪些字段做展示,需要使用哪些字段。一般对于resVo响应实体,都是包含哪些应该返回的字段(前端应该展示的字段),这种的再后面查询数据库的时候,直接查询该展示的字段,这是没有任何异......
  • springboot3项目的搭建三(统一返回异常等)
    springboot3项目的搭建三(统一返回异常等) 一、统一返回(其实两部分,一个是返回错误码可枚举可类,另一个是返回的实体其中data是泛型)1.返回码:packagecom.qiqi.common.constants;publicenumReturnCode{SUCCESS(200,"操作成功"),NEED_LOGIN(401,"需要登录后操作......
  • SpringBoot之ThreadLocal保存请求用户信息
    一、ThreadLocal概述 线程局部变量,创建一个线程变量后,针对这个变量可以让每个线程拥有自己的变量副本,每个线程是访问的自己的副本,与其他线程的相互独立。二、具体代码demo实现(1)创建user实例对象@DatapublicclassUserDTO{privateLonguserId;privateStringU......
  • Springboot计算机毕业设计学生实习考勤的打卡小程序【附源码】开题+论文+mysql+程序+
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着高等教育的发展,学生实习已成为培养应用型人才的重要环节。然而,在学生实习管理过程中,考勤是一个关键环节,也是确保实习质量和学生安全的基础。传统......
  • Springboot计算机毕业设计学生食代小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:在当今数字化时代,随着移动互联网的普及和智能化技术的发展,学生群体的生活方式和消费习惯也在发生着深刻的变化。特别是在校园餐饮领域,学生们对于便捷......
  • 基于Springboot + vue实现的蜗牛兼职网--附源码+论文+数据库
    基于Springboot+vue实现的蜗牛兼职网摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot框架构......
  • Springboot本地+oss存储文件上传
    一、本地上传二、oss上传一:本地上传废话不多说直接搂代码html:<body><formmethod="post"enctype="multipart/form-data"id="form"><inputtype="file"name="xxx"id="xxx"></form><inputt......