没有为每个用户创建 JPA AuditorAware

Posted

技术标签:

【中文标题】没有为每个用户创建 JPA AuditorAware【英文标题】:JPA AuditorAware not getting created for each user 【发布时间】:2020-05-27 16:31:56 【问题描述】:

我已经使用 JPA 审计实现了审计。我的代码如下所示:

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class JpaConfiguration 

    @Bean
    @Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public AuditorAware<String> auditorAware() 
        final String currentUser;
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if(null != authentication) 
            currentUser = authentication.getName();
         else 
            currentUser = null;
        
        return () -> Optional.ofNullable(currentUser);
    

我面临的问题是,如果我使用一个用户登录并执行一些操作,它工作正常。但是当我注销并使用另一个用户登录时,它仍然只使用最后一个用户。

调试代码后,我发现 spring 没有为每个用户创建 AuditorAware bean。它的行为就像单例 bean。即使我也将范围指定为原型,它的行为仍然像单例。

【问题讨论】:

【参考方案1】:

AuditorAware 应该是一个单例。您应该在每次调用 AuditAware.getCurrentAuditor 时检索当前用户。不止一次。

将您的代码重写为类似的内容。


@Bean
public AuditorAware<String> auditorAware() 
    return () -> getCurrentAuthentication().map(Authentication::getName());


private Optional<Authentication> getCurrentAuthentication() 
  return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication());

【讨论】:

以上是关于没有为每个用户创建 JPA AuditorAware的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA - @OneToMany 为每个关系创建单独的表

Spring JPA - @OneToMany为每个关系创建单独的表

java中当表中没有记录,为空的时候,用jpa查询的结果返回的是null吗?

没有 id 的 JPA/Hibernate 继承

JPA 实体中的预/后加载更新

创建没有 persistence.xml 配置文件的 JPA EntityManager