springboot~jpa审计字段的自动填充
在使用 Spring Data JPA 中的 @CreatedDate
注解时,如果希望自动填充创建时间字段,通常需要结合 @EntityListeners(AuditingEntityListener.class)
注解一起使用。这是因为 @CreatedDate
等审计注解通常与审计事件监听器(AuditingEntityListener)一起工作,用于处理实体的审计信息。
审计字段-自动填充
当您定义一个实体类(例如 EntityBase
)并希望使用 @CreatedDate
注解来自动设置创建时间时,可以按照以下步骤操作:
- 在实体类中添加
@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;
}
-
确保审计事件监听器生效:
确保AuditingEntityListener
能够正确监听实体类的审计事件,并在保存实体对象时自动填充相应的审计信息,包括创建时间等。 -
实现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 提供的 RequestContextHolder
和 ServletRequestAttributes
来访问当前请求的上下文信息。具体步骤如下:
-
获取当前请求的 HttpServletRequest 对象:
- 首先,您需要从
RequestContextHolder.getRequestAttributes()
获取当前请求的ServletRequestAttributes
对象。 - 然后通过
ServletRequestAttributes
对象获取当前的HttpServletRequest
对象。
- 首先,您需要从
-
从 HttpServletRequest 中获取请求头信息:
- 在
HttpServletRequest
对象中,您可以使用getHeader()
方法来获取指定名称的请求头信息。
- 在
下面是一个示例代码,演示了如何在 AuditorAware
的 getCurrentAuditor()
方法中获取当前请求头中的变量:
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 的应用。