@createdby和@lastmodifiedby设置实际实体而不是id

bbuxkriu  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(342)

我有一个实体,看起来像:

@Audited
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

  public static final long UNSAVED = 0;

  @Id
  @GeneratedValue
  private long id;

  @CreatedDate
  @Column(name = "created_at", updatable = false)
  private ZonedDateTime createdAt;

  @CreatedBy
  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "created_by")
  private User createdBy;

  @LastModifiedDate
  private ZonedDateTime updatedAt;

  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "updated_by")
  @LastModifiedBy
  private User updatedBy;

}

我想要@lastmodifiedby和@createdby,以便它们设置相应的用户。但是,当我尝试保存实体时,出现了一个异常:

java.lang.ClassCastException: Cannot cast java.lang.Long to com.intranet.users.Users

所以在我看来,它试图设置的不是实际用户,而是id。有没有办法让spring在实体上设置实际用户而不仅仅是id?
谢谢

jrcvhitl

jrcvhitl1#

文件似乎很直接地回答了这个问题:
如果您使用@createdby或@lastmodifiedby,审计基础结构需要知道当前主体。为此,我们提供了一个auditoraware spi接口,您必须实现该接口来告诉基础结构与应用程序交互的当前用户或系统是谁。泛型类型t定义了用@createdby或@lastmodifiedby注解的属性必须是什么类型。
以下示例显示了使用spring security的身份验证对象的接口的实现:
例104。基于spring安全机制的auditoraware实现

class SpringSecurityAuditorAware implements AuditorAware<User> {

  public Optional<User> getCurrentAuditor() {

    return Optional.ofNullable(SecurityContextHolder.getContext())
        .map(SecurityContext::getAuthentication)
        .filter(Authentication::isAuthenticated)
        .map(Authentication::getPrincipal)
        .map(User.class::cast);   
  } 
}

该实现访问springsecurity提供的身份验证对象,并查找您在userdetailsservice实现中创建的自定义userdetails示例。这里我们假设您通过userdetails实现公开域用户,但是基于找到的身份验证,您还可以从任何地方查找它。

相关问题