我在工作的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之后,您将设置这个特定的依赖关系。

09-05 18:17