springboot~jpa審計(jì)字段的自動(dòng)填充
在使用 Spring Data JPA 中的 @CreatedDate 注解時(shí),如果希望自動(dòng)填充創(chuàng)建時(shí)間字段,通常需要結(jié)合 @EntityListeners(AuditingEntityListener.class) 注解一起使用。這是因?yàn)?@CreatedDate 等審計(jì)注解通常與審計(jì)事件監(jiān)聽器(AuditingEntityListener)一起工作,用于處理實(shí)體的審計(jì)信息。
審計(jì)字段-自動(dòng)填充
當(dāng)您定義一個(gè)實(shí)體類(例如 EntityBase)并希望使用 @CreatedDate 注解來自動(dòng)設(shè)置創(chuàng)建時(shí)間時(shí),可以按照以下步驟操作:
- 在實(shí)體類中添加
@CreatedDate注解,實(shí)體可抽象成一個(gè)類,如EntityBase,AuditBase等:
@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class EntityBase {
/**
* 創(chuàng)建人
*/
@Column(name = "created_by")
@CreatedBy
private String createdBy;
/**
* 修改人
*/
@Column(name = "updated_by")
@LastModifiedBy
private String updatedBy;
/**
* 創(chuàng)建時(shí)間
*/
@Column(name = "created_time")
@CreatedDate
private java.time.LocalDateTime createdTime;
/**
* 更新時(shí)間
*/
@Column(name = "update_time")
@LastModifiedDate
private java.time.LocalDateTime updateTime;
}
-
確保審計(jì)事件監(jiān)聽器生效:
確保AuditingEntityListener能夠正確監(jiān)聽實(shí)體類的審計(jì)事件,并在保存實(shí)體對象時(shí)自動(dòng)填充相應(yīng)的審計(jì)信息,包括創(chuàng)建時(shí)間等。 -
實(shí)現(xiàn)AuditorAware接口,返回當(dāng)前登錄的用戶,以便填充create_by字段,同時(shí)開啟審計(jì)功能@EnableJpaAuditing:
@EnableJpaAuditing
@Component
public class AuditorAwareImpl implements AuditorAware {
@Override
public Optional getCurrentAuditor() {
return Optional.of("lind");
}
}
通過以上步驟,您可以在訂閱 EntityBase 實(shí)體類時(shí)使用 @CreatedDate 注解,并結(jié)合 @EntityListeners(AuditingEntityListener.class) 注解來自動(dòng)填充創(chuàng)建時(shí)間字段,從而實(shí)現(xiàn)審計(jì)功能。
AuditorAware獲取請求頭信息
要在實(shí)現(xiàn) AuditorAware 接口的 getCurrentAuditor() 方法中獲取當(dāng)前請求頭(HTTP Header)中的變量,您可以借助 Spring 提供的 RequestContextHolder 和 ServletRequestAttributes 來訪問當(dāng)前請求的上下文信息。具體步驟如下:
-
獲取當(dāng)前請求的 HttpServletRequest 對象:
- 首先,您需要從
RequestContextHolder.getRequestAttributes()獲取當(dāng)前請求的ServletRequestAttributes對象。 - 然后通過
ServletRequestAttributes對象獲取當(dāng)前的HttpServletRequest對象。
- 首先,您需要從
-
從 HttpServletRequest 中獲取請求頭信息:
- 在
HttpServletRequest對象中,您可以使用getHeader()方法來獲取指定名稱的請求頭信息。
- 在
下面是一個(gè)示例代碼,演示了如何在 AuditorAware 的 getCurrentAuditor() 方法中獲取當(dāng)前請求頭中的變量:
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框架,需要使用下面代碼獲取請求頭參數(shù)
@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 獲取當(dāng)前請求的上下文信息,并從中提取出請求頭中名為 Custom-Header 的自定義變量值。最后將該值作為審計(jì)人員信息返回。
請注意,在使用
RequestContextHolder時(shí),確保上下文中包含請求信息,否則可能會(huì)出現(xiàn)空指針異常。另外,這種方式適用于基于 Spring MVC 或 Spring WebFlux 的應(yīng)用。
浙公網(wǎng)安備 33010602011771號(hào)