首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加依赖项后找不到spring转换器

添加依赖项后找不到spring转换器
EN

Stack Overflow用户
提问于 2022-07-25 08:51:21
回答 1查看 77关注 0票数 4

我有一个现有的弹簧(5.3.9)转换器。它是一个无状态转换器:没有成员,空的默认构造函数。使用此表单,它将被拾取并与我的系统很好地工作:

代码语言:javascript
复制
class Conv implements Converter<A, B> {
    public B convert(A a) {
    ...
    }
}

当向此转换器添加状态时(对另一个bean的任何引用):

代码语言:javascript
复制
class Conv implements Converter<A, B> {
    // the state
    private final X x; 

    public Conv(X x) {
        this.x = x;
    }
    public B convert(A a) {
    ...
    }
}

.问题:现在,在运行时中找不到转换器

无转换器可从A型转换为B型

转换器本身将被成功地创建,并且仍然被生命周期所捕获。依赖关系可以很好地注入,并且它存在(在构造函数中处于调试状态)。bean初始化过程中没有任何异常。我尝试过使用构造注入;@Autowired注入-我得到了同样的行为。

最后,在与一位同事讨论后,他建议在构造函数的论点中添加@Lazy

代码语言:javascript
复制
class Conv implements Converter<A, B> {
        // the state
        private final X x; 
    
        public Conv(@Lazy X x) {
            this.x = x;
        }
        public B convert(A a) {
        ...
        }
    }

令人惊讶的是,它解决了问题!现在可以在添加状态之前找到并使用转换器。

(update:我无法创建一个最小的示例来重现这个问题。它可能与我真正的bean依赖关系有关。)

你能解释一下为什么@Lazy做了这个把戏吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-26 07:17:40

问题是,Converter需要在生命周期中的某个时间注册。向其添加依赖项改变了可以创建此转换器的位置。

现在,当添加@Lazy时,可以在正确的时间再次进行构造,因为现在只有在使用依赖项时才会使用/检测该依赖项。@Lazy将作为依赖项的代理,在使用时将执行ApplicationContext.getBean调用,而不是在构造对象时执行。

因此,基本上,它与在上下文生命周期中,如果可以使用或不使用对象,可以构造对象的位置有关。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73106411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档