执行Java代码时遭遇构造函数匹配错误,寻求解决方案
解决构造函数匹配歧义问题
嘿,我看你碰到了依赖注入框架里的构造函数匹配歧义问题,这个报错"Could not resolve matching constructor"就是框架没法确定该用Dad类里的哪一个构造函数来实例化对象导致的。先把你的代码整理出来方便查看:
你的Dad类代码
package TestingDependecy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Dad { private Mom mom; private Child child; public Dad (Mom mom) { this.mom = mom; } public Dad (Child child) { this.child = child; } public void name() throws IOException { System.out.println("please enter a name .."); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 你没写完的代码不影响构造函数问题哈 } }
几种可行的解决方法,你按需选择:
给框架指定首选构造函数:如果用的是Spring这类框架,直接在你想优先使用的构造函数上加上
@Autowired注解就行,框架会明确知道该选哪一个:public class Dad { private Mom mom; private Child child; @Autowired // 告诉Spring优先用这个构造函数 public Dad (Mom mom) { this.mom = mom; } public Dad (Child child) { this.child = child; } // 其他代码不变 }要是用XML配置bean的话,就用
constructor-arg指定参数类型或者索引来明确:<bean id="dad" class="TestingDependecy.Dad"> <constructor-arg type="TestingDependecy.Mom" ref="momBean"/> </bean>合并构造函数:如果业务允许,把两个构造函数合并成一个,同时接收
Mom和Child参数,这样就没歧义了。要是其中一个参数可选,还能给它加默认值(Java 8及以上支持):// 合并后的构造函数,两个参数都必填 public Dad (Mom mom, Child child) { this.mom = mom; this.child = child; } // 或者让Child参数可选 public Dad (Mom mom, Child child = null) { this.mom = mom; this.child = child; }用
@Qualifier明确注入目标:要是两个构造函数都得保留,就在构造函数参数上加上@Qualifier标注对应的bean名称,同时给Mom和Child的bean也加上对应的@Qualifier:public Dad (@Qualifier("momBean") Mom mom) { this.mom = mom; } public Dad (@Qualifier("childBean") Child child) { this.child = child; }然后在
Mom和Child的类上或者bean配置里加上@Qualifier("momBean")和@Qualifier("childBean"),这样框架就能精准匹配了。删掉没用的构造函数:如果其中一个构造函数在实际业务里根本用不上,直接删掉它就行,框架只会找到唯一的构造函数,自然不会报错了。
内容的提问来源于stack exchange,提问作者Sai Kiran Bachu
相关产品推荐
相关产品推荐

