@CreatedBy和@LastModifiedBy设置实际实体而不是id

时间:2018-12-06 19:36:38

标签: java spring-boot spring-security spring-data-jpa spring-data

我有一个看起来像这样的实体

@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 set成为实体上的实际用户,而不仅仅是其id?

谢谢

1 个答案:

答案 0 :(得分:5)

the documentation似乎可以直接回答:

  

如果使用@CreatedBy或@LastModifiedBy,则审核   基础设施需要以某种方式了解当前的原则。   为此,我们需要提供一个AuditorAware SPI接口   实施以告知基础结构当前用户或系统是谁   与应用程序进行交互。通用类型T定义了什么   输入@CreatedBy或@LastModifiedBy注释的属性   成为。

     

以下示例显示了该接口的实现,   使用Spring Security的Authentication对象:

     

示例104.基于Spring Security的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);   
  } 
} 
     

该实现访问Spring Security提供的Authentication对象,并查找   您在自己创建的自定义UserDetails实例   UserDetailsS​​ervice实现。我们在这里假设您是   通过UserDetails实现公开域用户,但是   根据找到的身份验证,您还可以查找它   从任何地方。