![](/img/trans.png)
[英]Spring MVC to SpringBoot 2: The bean 'xyz' could not be injected as a 'com..Abc' because it is a JDK dynamic proxy that implements:
[英]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 上嘗試了各種解決方案,但都沒有成功,特別是:
將@Component 添加到 SwitchUserFilter 的頂部
將@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.