我有一个看起来像这样的实体
@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?
谢谢
答案 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实例 UserDetailsService实现。我们在这里假设您是 通过UserDetails实现公开域用户,但是 根据找到的身份验证,您还可以查找它 从任何地方。