Spring无法通过工厂方法创建UpdatingBatch Bean问题求助
问题原因与解决方案
原因分析
你遇到的问题核心在于@StepScope的作用机制:
- 当
@Bean方法搭配@StepScope使用时,Spring不会直接调用你的updatingBatch()方法创建实例,而是会为该Bean生成代理对象,以此实现Step级别的延迟实例化(直到Batch的Step真正执行时才会创建真实对象)。 - 默认情况下,
@StepScope使用CGLIB代理方式,这种代理需要生成目标类的子类。但com.filenet.api.core.UpdatingBatch没有可访问的构造方法(比如构造方法是私有、包级私有,或JVM生成的无参构造不可见),导致CGLIB无法生成子类,从而抛出错误。
解决方案
针对这个问题,优先推荐以下可行方案:
切换为JDK动态代理
如果UpdatingBatch实现了某个接口,直接修改@StepScope的代理模式为接口代理即可。这种方式不需要生成子类,也就不需要目标类的构造方法:
@Bean @StepScope(proxyMode = ScopedProxyMode.INTERFACES) public UpdatingBatch updatingBatch(OSRefEnabledFileNetConnectionContext context) { return UpdatingBatch.createUpdatingBatchInstance(context, Refreshmode.OFF); }
补充说明
如果UpdatingBatch是自定义类,还可以通过修改其构造方法为public/包级可见来适配CGLIB代理,但显然这不适用于FileNet的第三方类,因此第一种方案是最优解。
内容的提问来源于stack exchange,提问作者apboutos
相关产品推荐
相关产品推荐

