![](/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.