Spring 引导:无法将 bean 'auditLogDao' 作为'AuditLogDao'注入,因为它是 JDK 动态代理



我在工作的Spring Boot项目中遇到以下错误:

bean"auditLogDao"无法作为"{redectedpath withcorporatename}.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之后,您将设置这个特定的依赖项。

相关内容

最新更新