亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

即使條件為假,Spring bean 也總是返回相同的值

即使條件為假,Spring bean 也總是返回相同的值

慕的地8271018 2023-06-14 14:29:41
我正在使用 spring data jpa 為我的實體填充審計數據。我們有一個每晚運行的 quartz 作業,它不會被驗證,在這種情況下,我們希望“createdBy”值為“system”。在其他情況下,我們希望它填充當前登錄的用戶。當我通過 UI 創建 Purcahse 訂單時,“createdBy”字段始終填充有“system”,而不是當前登錄的用戶 ID。我嘗試讓 AuditorAware bean 變得懶惰并將范圍更改為原型,但它們都不起作用。我在代碼中放置了一個斷點,我可以看到 SecurityContext 和 Authentication 對象不為空,但它仍然返回“系統”@Entity@EntityListeners(AuditingEntityListener.class)public class Purchase{    String purchaseNbr;    @CreatedBy    private String createdBy;}@Configuration@EnableJpaAuditingpublic class Auditconfig{    @Bean    public AuditorAware<String> auditAware(){        if(SecurityContextHolder.getContext()==null || SecurityContextHolder.getContext.getAuthentication() == null ) {             //during spring context initialization, i can see this branch gets hit, if i put a breakpoint here             return () -> Optional.of("system");        }else {             //this branch never gets hit even when "if" condition is false during runtime             return () -> Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());         }    }}預期“createdBy”是當前用戶,但始終是“系統”
查看完整描述

1 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

該方法auditAware()僅在啟動時執行一次。此時,沒有當前用戶。所以你總是回來


() -> Optional.of("system")

而這個 AuditorAware 實例,無論何時被調用,都會因此總是返回


Optional.of("system")

您想要的是一個 AuditAware,無論何時調用它,都會測試當前用戶是誰,并確定它應該返回什么。所以應該是


@Bean

public AuditorAware<String> auditAware(){

    return () -> {

        if (SecurityContextHolder.getContext() == null || SecurityContextHolder.getContext.getAuthentication() == null) {

            return Optional.of("system");

        } else {

            return Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());

        }

    }

}


查看完整回答
反對 回復 2023-06-14
  • 1 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號