我在工作的Spring Boot项目中遇到以下错误:
Bean'auditLogDao'不能作为'{redactedpathwithcorporatename} .AuditLogDao'注入,因为它是实现以下功能的JDK动态代理:
org.springframework.data.jpa.repository.JpaRepository
行动:
考虑通过在@EnableAsync和/或@EnableCaching上设置proxyTargetClass = true,将Bean作为其接口之一注入或强制使用基于CGLib的代理。
我已经在StackOverflow上尝试了多种解决方案,但均未成功,特别是:
Checking that I am indeed calling the interface, not the implementation.
在SwitchUserFilter的顶部添加@Component
将@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之后,您将设置这个特定的依赖关系。