簡體   English   中英

Spring 引導:無法將 bean 'auditLogDao' 作為 'AuditLogDao' 注入,因為它是 JDK 動態代理

[英]Spring Boot: The bean 'auditLogDao' could not be injected as a 'AuditLogDao' because it is a JDK dynamic proxy

我在我工作的 Spring 引導項目中收到以下錯誤:

無法將 bean 'auditLogDao' 作為 '{redactedpathwithcorporatename}.AuditLogDao' 注入,因為它是一個 JDK 動態代理,它實現了:org.springframework.data.jpa.repository.JpaRepository

行動:

考慮將 bean 作為其接口之一注入或通過在 @EnableAsync 和/或 @EnableCaching 上設置 proxyTargetClass=true 來強制使用基於 CGLib 的代理。

我在 StackOverflow 上嘗試了各種解決方案,但都沒有成功,特別是:

  1. 檢查我確實在調用接口,而不是實現。

  2. 將@Component 添加到 SwitchUserFilter 的頂部

  3. 將@Resource 更改為@Autowired。

AuditLogDao.java

public interface AuditLogDao extends JpaRepository<AuditLog, String> {}

AuditLogService.java

public interface AuditLogService {
    AuditLog save(final AuditLog auditLog);
}

AuditLogServiceImplementation.java

public class AuditLogServiceImplementation implements AuditLogService{

    @Resource private AuditLogDao auditLogDao;

    @Override
    public AuditLog save(AuditLog auditLog) {
        return auditLogDao.save(auditLog);
    }
}

我實際要使用該服務保存信息的文件

SwitchuserFilter.java

public class SwitchUserFilter
        extends org.springframework.security.web.authentication.switchuser.SwitchUserFilter {
    @Resource AuditLogService logService;
'''
        logService.save(auditLog);
'''
}

我對 Spring Boot 相對較新,因此請解釋一下它解決問題的原因。

我相信下面的代碼會解決你的問題。 將其添加到AuditLogServiceImplementation並從 auditLogDao 中刪除@Resource注釋。

@Autowired
private ListableBeanFactory beanFactory;

@EventListener({ContextRefreshedEvent.class})
void contextRefreshedEvent() {
    auditLogDao = beanFactory.getBean(AuditLogDao.class);
}

您也可以在過濾器中執行類似的技巧,無論您覺得更舒服。

我不知道確切的問題是什么,但這是某種類似循環依賴的問題。 因此,通過手動導入在此循環中受影響的任何 bean,您可以解決該循環。 在 Spring 創建了所有其他 bean 之后,您將設置這個特定的依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM