springboot~jpa審計字段的(de)自動填(tian)充
在使用 Spring Data JPA 中的 @CreatedDate 注解時,如果希望自動填充創建時間字段,通常需要結合 @EntityListeners(AuditingEntityListener.class) 注解一起使用。這是因為 @CreatedDate 等審(shen)計注解通常與審(shen)計事件(jian)監聽器(AuditingEntityListener)一(yi)起工(gong)作(zuo),用于(yu)處理(li)實體的審(shen)計信息。
審計字段-自動填充
當您定義一個實體類(例如 EntityBase)并希望使用 @CreatedDate 注解來自(zi)動設置創建時間時,可以(yi)按照(zhao)以(yi)下步驟操作:
- 在實體類中添加
@CreatedDate注解,實體可抽象成一個類,如EntityBase,AuditBase等:
@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class EntityBase {
/**
* 創建人
*/
@Column(name = "created_by")
@CreatedBy
private String createdBy;
/**
* 修改人
*/
@Column(name = "updated_by")
@LastModifiedBy
private String updatedBy;
/**
* 創建時間
*/
@Column(name = "created_time")
@CreatedDate
private java.time.LocalDateTime createdTime;
/**
* 更新時間
*/
@Column(name = "update_time")
@LastModifiedDate
private java.time.LocalDateTime updateTime;
}
-
確保審計事件監聽器生效:
確保AuditingEntityListener能(neng)夠正確(que)監聽實體類的審計(ji)事件,并(bing)在保存(cun)實體對象時(shi)自動填(tian)充相(xiang)應的審計(ji)信(xin)息,包(bao)括(kuo)創建時(shi)間等。 -
實現AuditorAware接口,返回當前登錄的用戶,以便填充create_by字段,同時開啟審計功能@EnableJpaAuditing:
@EnableJpaAuditing
@Component
public class AuditorAwareImpl implements AuditorAware {
@Override
public Optional getCurrentAuditor() {
return Optional.of("lind");
}
}
通過以上步驟,您可以在訂閱 EntityBase 實體類時使用 @CreatedDate 注解,并結合 @EntityListeners(AuditingEntityListener.class) 注解來自動填(tian)充創建(jian)時間(jian)字(zi)段,從而(er)實現審計功能。
AuditorAware獲取請求頭信息
要在實現 AuditorAware 接口的 getCurrentAuditor() 方法中獲取當前請求頭(HTTP Header)中的變量,您可以借助 Spring 提供的 RequestContextHolder 和 ServletRequestAttributes 來訪問當(dang)前(qian)請求的上下文信息。具體步驟如下:
-
獲取當前請求的 HttpServletRequest 對象:
- 首先,您需要從
RequestContextHolder.getRequestAttributes()獲取當前請求的ServletRequestAttributes對象。 - 然后通過
ServletRequestAttributes對象獲取當前的HttpServletRequest對象。
- 首先,您需要從
-
從 HttpServletRequest 中獲取請求頭信息:
- 在
HttpServletRequest對象中,您可以使用getHeader()方法來獲取指定名稱的請求頭信息。
- 在
下面是一個示例代碼,演示了如何在 AuditorAware 的 getCurrentAuditor() 方法中獲取當前(qian)請(qing)求頭中的變量:
import org.springframework.data.domain.AuditorAware;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Optional;
@EnableJpaAuditing
@Component
public class CustomAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
String customHeaderValue = request.getHeader("Custom-Header");
return Optional.ofNullable(customHeaderValue);
}
return Optional.empty();
}
}
如果是基于netty的WEB框架,需(xu)要(yao)使用下面代碼獲(huo)取請求頭參數
@EnableJpaAuditing
@Component
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
Object request = RpcContext.getServiceContext().getRequest();
if (request != null) {
NettyRequestFacade requestFacade = (NettyRequestFacade) request;
if (requestFacade != null && requestFacade.getHeader("preferred_username") != null) {
return Optional.of(requestFacade.getHeader("preferred_username"));
}
}
return Optional.of("none");
}
}
在上述代碼中,我們通過 RequestContextHolder 獲取當前請求的上下文信息,并從中提取出請求頭中名為 Custom-Header 的(de)自定義變量值(zhi)。最后(hou)將該(gai)值(zhi)作為審計人員信息返(fan)回。
請注意,在使用
RequestContextHolder時,確(que)保上(shang)下(xia)文中包(bao)含請求信息,否則(ze)可能會(hui)出現空(kong)指(zhi)針異(yi)常。另外,這種方式適用于(yu)基于(yu) Spring MVC 或(huo) Spring WebFlux 的應用。