ToB企服应用市场:ToB评测及商务社交产业平台

标题: springboot~jpa审计字段的自动填充 [打印本页]

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

当您界说一个实体类(比方 EntityBase)并希望使用 @CreatedDate 注解来自动设置创建时间时,可以按照以下步骤操作:
  1. @Getter
  2. @Setter
  3. @MappedSuperclass
  4. @EntityListeners(AuditingEntityListener.class)
  5. public abstract class EntityBase {
  6.         /**
  7.          * 创建人
  8.          */
  9.         @Column(name = "created_by")
  10.         @CreatedBy
  11.         private String createdBy;
  12.         /**
  13.          * 修改人
  14.          */
  15.         @Column(name = "updated_by")
  16.         @LastModifiedBy
  17.         private String updatedBy;
  18.         /**
  19.          * 创建时间
  20.          */
  21.         @Column(name = "created_time")
  22.         @CreatedDate
  23.         private java.time.LocalDateTime createdTime;
  24.         /**
  25.          * 更新时间
  26.          */
  27.         @Column(name = "update_time")
  28.         @LastModifiedDate
  29.         private java.time.LocalDateTime updateTime;
  30. }
复制代码
  1. @EnableJpaAuditing
  2. @Component
  3. public class AuditorAwareImpl implements AuditorAware {
  4.         @Override
  5.         public Optional getCurrentAuditor() {
  6.                 return Optional.of("lind");
  7.         }
  8. }
复制代码
通过以上步骤,您可以在订阅 EntityBase 实体类时使用 @CreatedDate 注解,并结合 @EntityListeners(AuditingEntityListener.class) 注解来自动填充创建时间字段,从而实现审计功能。
AuditorAware获取请求头信息

要在实现 AuditorAware 接口的 getCurrentAuditor() 方法中获取当前请求头(HTTP Header)中的变量,您可以借助 Spring 提供的 RequestContextHolder 和 ServletRequestAttributes 来访问当前请求的上下文信息。具体步骤如下:
下面是一个示例代码,演示了如安在 AuditorAware 的 getCurrentAuditor() 方法中获取当前请求头中的变量:
  1. import org.springframework.data.domain.AuditorAware;
  2. import org.springframework.web.context.request.RequestContextHolder;
  3. import org.springframework.web.context.request.ServletRequestAttributes;
  4. import javax.servlet.http.HttpServletRequest;
  5. import java.util.Optional;
  6. @EnableJpaAuditing
  7. @Component
  8. public class CustomAuditorAware implements AuditorAware<String> {
  9.     @Override
  10.     public Optional<String> getCurrentAuditor() {
  11.         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  12.         if (attributes != null) {
  13.             HttpServletRequest request = attributes.getRequest();
  14.             String customHeaderValue = request.getHeader("Custom-Header");
  15.             return Optional.ofNullable(customHeaderValue);
  16.         }
  17.         return Optional.empty();
  18.     }
  19. }
复制代码
如果是基于netty的WEB框架,需要使用下面代码获取请求头参数
  1. @EnableJpaAuditing
  2. @Component
  3. public class AuditorAwareImpl implements AuditorAware<String> {
  4.         @Override
  5.         public Optional<String> getCurrentAuditor() {
  6.                 Object request = RpcContext.getServiceContext().getRequest();
  7.                 if (request != null) {
  8.                         NettyRequestFacade requestFacade = (NettyRequestFacade) request;
  9.                         if (requestFacade != null && requestFacade.getHeader("preferred_username") != null) {
  10.                                 return Optional.of(requestFacade.getHeader("preferred_username"));
  11.                         }
  12.                 }
  13.                 return Optional.of("none");
  14.         }
  15. }
复制代码
在上述代码中,我们通过 RequestContextHolder 获取当前请求的上下文信息,并从中提取出请求头中名为 Custom-Header 的自界说变量值。末了将该值作为审计职员信息返回。
请注意,在使用 RequestContextHolder 时,确保上下文中包含请求信息,否则可能会出现空指针非常。别的,这种方式适用于基于 Spring MVC 或 Spring WebFlux 的应用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4