我们有一个microweb服务环境,其中AbstractAuditingEntity来自另一个常见的微服务。我想用我自己定义的值覆盖这个抽象类的@CreatedBy属性。
我的代码如下。
In [176]: df
Out[176]:
a b
0 1 5.0
1 2 NaN
2 3 6.0
3 4 NaN
In [177]: df['b'] = df['b'].fillna(df['a'])
In [178]: df
Out[178]:
a b
0 1 5.0
1 2 2.0
2 3 6.0
3 4 4.0
我的Domain类就像
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractAuditingEntity {
@Column(name = "created_by", insertable = true, updatable = false, nullable = false)
@CreatedBy
private String createdBy;
@Column(name = "created_date", insertable = true, updatable = false, nullable = false)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@CreatedDate
private DateTime createdDate;
@Column(name = "last_modified_by", nullable = false)
@LastModifiedBy
private String lastModifiedBy;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@LastModifiedDate
private DateTime lastModifiedDate;
// @Transient
public abstract Long getInternalId();
// @Transient
public abstract void setInternalId(Long internalId);
public DateTime getCreatedDate() {
return createdDate;
}
public void setCreatedDate(DateTime createdDate) {
this.createdDate = createdDate;
}
public DateTime getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(DateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getLastModifiedBy() {
return lastModifiedBy;
}
public void setLastModifiedBy(String lastModifiedBy) {
this.lastModifiedBy = lastModifiedBy;
}
}
当我们尝试将此域对象保留在数据库中时,我提供的用户定义值不会持续存在,而是Spring框架仍然添加自己的值。我尝试过@AttributeOverride,但它在我的情况下并不起作用。
提前感谢您的帮助。
答案 0 :(得分:2)
我得到了如下解决方案。
@PrePersist
private void setCreateByNew() {
setCreatedBy("anonymousUser");
}
使用@PrePersist我能够覆盖我从普通框架获得的值。
答案 1 :(得分:1)
for:我提供的用户定义值没有得到持久化,相反Spring框架仍然添加了自己的值
您可以使用AuditorAware界面完成此操作。 3.1.3 AuditorAware
如果您使用@CreatedBy或@LastModifiedBy,则审核 基础设施不知何故需要了解当前的原则。 为此,我们提供您必须使用的AuditorAware SPI接口 实现告诉基础设施当前用户或系统 与应用程序交互是。泛型类型T定义 使用@CreatedBy或@LastModifiedBy注释的属性的类型 必须是。
这是使用Spring的接口的示例实现 安全性的身份验证对象:
例3.2。基于Spring Security实现AuditorAware
class SpringSecurityAuditorAware implements AuditorAware<User> {
public User getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
return null;
}
return ((MyUserDetails) authentication.getPrincipal()).getUser();
}
}
答案 2 :(得分:0)
另一种解决方案是设置securityContext
SecurityContextHolder.getContext().setAuthentication(___{AuthToken}___)
使用您要用来在实体保存之前自动填充审核字段的用户名/原则,然后在此之后将其重置。 (用于以异步方式处理消息或事件)。这将从JPA AuditAware侦听器中同时填充@Createdby
和@LastUpdatedBy
。
@PrePersist仅在如上所述尝试对预定义的字符串setCreatedBy("anonymousUser");
进行硬编码时才有效。它不允许我们将用户名/用户名作为参数传递给方法。