当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:bean'audit logdao'不能作为'auditlogdao'注入,因为它是一个JDK动态代理

叶衡虑
2023-03-14

考虑注入bean作为其接口之一,或者通过在@enableAsync和/或@enablecaching上设置ProxyTargetClass=true强制使用基于CGLIB的代理。

我尝试了多种关于StackOverflow的解决方案,但都没有成功,特别是:

>

  • 检查我是否确实调用了接口,而不是实现。

    将@Component添加到SwitchUserFilter的顶部

    将@resource更改为@autowired。

    public interface AuditLogDao extends JpaRepository<AuditLog, String> {}
    
    public interface AuditLogService {
        AuditLog save(final AuditLog auditLog);
    }
    
    
    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引导,所以解释为什么它修复了问题将是赞赏的。

  • 共有1个答案

    邹俊豪
    2023-03-14

    相信下面的代码会解决你的问题。将其添加到AuditLogServiceImplementation中,并从AuditLogDAO中删除@resource注释。

    @Autowired
    private ListableBeanFactory beanFactory;
    
    @EventListener({ContextRefreshedEvent.class})
    void contextRefreshedEvent() {
        auditLogDao = beanFactory.getBean(AuditLogDao.class);
    }
    

    你也可以在过滤器中做一个类似的把戏,只要你觉得更舒服。

    我不知道确切的问题是什么,但它是某种类似于循环依赖的问题。因此,通过手动导入该循环中受影响的任何bean,您可以解析该循环。您将在Spring创建所有其他bean之后设置这个特定的依赖项。

     类似资料:
    • 我用的是angular2 beta 15,在我的一个模板中我做到了: 但是,我得到了这个例外 因此,如何解决?有什么想法?

    • 我正在尝试将AGM Angular谷歌地图(https://github.com/SebastianM/angular-google-maps)添加到我的Angular4项目中 指南是:https://github.com/SebastianM/angu 当我访问带有agm组件的页面时遇到的错误: 我已经确定/尝试过; 我的模块导入 在我的模块中向架构添加了CUSTOM_ELEMENTS_SCHE

    • 问题内容: JDK Proxy类仅在工厂方法newProxyInstance()中接受接口。 是否有可用的解决方法或替代实施?如果我必须将方法提取到接口以使其能够与代理一起使用,则用例是有限的。我想包装它们以在运行时应用基于注释的动作。 问题答案: 您可以像这样使用cglib: 例如,这使您可以使用默认的实现方法来构建抽象类。但是您可以将增强器更改为所需的增强器。

    • 本文向大家介绍一个简单JDK版动态代理,包括了一个简单JDK版动态代理的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了手动实现的一个简单JDK版动态代理,供大家参考,具体内容如下 一.实现步骤 1.根据目标类的接口类型生成代理类的java文件。 2.编译代理类java文件为.class字节码文件。 3.将编译好的字节码文件加载到jvm中。 4.生成代理类对象并返回。 二.代码实现 1

    • 我升级我的混凝土5.7网站从PHP 5.6. x到7.0.4,并得到以下错误 触发这一点的函数本身就是一个具体的5函数。 我能做些什么来解决这个问题? PHP7.0。12-1黛布。苏里。org~trusty 1(cli)(NTS)版权所有(c)1997-2016 PHP Group Zend Engine v3。0.0,版权所有(c)1998-2016 Zend Technologies与Zend

    • 我的系统是Linux Mint 18.3 Cinnamon 64位。 我已经使用软件管理器安装了IntelliJ-IDEA和Default-jdk(openjdk-8-jdk)。 甚至不确定如何使用从命令行启动IDEA,例如,测试问题是否与权限相关,因为它显然是通过FlatPak代理启动的。 看来这应该很简单。我不确定我做错了什么。