我在工作的Spring Boot项目中遇到以下错误:
bean"auditLogDao"无法作为"{redectedpath withcorporatename}.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之后,您将设置这个特定的依赖项。