В Spring framework, когда ваш класс содержит несколько конструкторов с одинаковым количеством аргументов, это всегда будет вызывать неоднозначность типа аргумента инъекции конструктора .
Проблема
Давайте рассмотрим этот пример с клиентскими бобами. Он содержит два метода конструктора, оба принимают 3 аргумента с разными типами данных.
package com.mkyong.common; public class Customer { private String name; private String address; private int age; public Customer(String name, String address, int age) { this.name = name; this.address = address; this.age = age; } public Customer(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } //getter and setter methods public String toString(){ return " name : " +name + "\n address : " + address + "\n age : " + age; } }
В файле конфигурации Spring bean введите “mkyong” для имени, “188” для адреса и “28” для возраста.
mkyong 188 28
Запустите его, каков ваш ожидаемый результат?
package com.mkyong.common; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main( String[] args ) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"}); Customer cust = (Customer)context.getBean("CustomerBean"); System.out.println(cust); } }
Выход
name : mkyong address : 28 age : 188
Результат не такой, как мы ожидали, вместо первого конструктора запускается второй конструктор. В Spring тип аргумента ‘188’ способен преобразовываться в int, поэтому Spring просто преобразует его и использует второй конструктор, даже если вы предполагаете, что это должна быть строка.
Кроме того, если Spring не может решить, какой конструктор использовать, он выдаст следующее сообщение об ошибке
constructor arguments specified but no matching constructor found in bean 'CustomerBean' (hint: specify index and/or type arguments for simple parameters to avoid type ambiguities)
Решение
Чтобы исправить это, вы всегда должны указывать точный тип данных для конструктора с помощью атрибута типа, подобного этому:
mkyong 188 28
Запустите его еще раз, теперь вы получите то, что ожидали.
Выход
name : mkyong address : 188 age : 28
Оригинал: “https://mkyong.com/spring/constructor-injection-type-ambiguities-in-spring/”