Конструктор инжекционного типа двусмысленности в Spring
В среде Spring, когда ваш класс содержит несколько конструкторов с одинаковым количеством аргументов, это всегда будет вызывать проблемуconstructor injection argument type ambiguities.
проблема
Давайте посмотрим на этот пример bean-компонента. Он содержит два метода конструктора, оба принимают 3 аргумента с разными типами данных.
package com.example.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; } }
В файле конфигурации bean-компонента Spring передайте «example» для имени, «188» для адреса и «28» для возраста.
example 188 28
Запустите его, каков ваш ожидаемый результат?
package com.example.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 : example 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)
Решение
Чтобы это исправить, вы всегда должны указывать точный тип данных для конструктора через атрибут type, например так:
example 188 28
Запустите его снова, теперь вы получите то, что ожидали.
Выход
name : example address : 188 age : 28
Note
Всегда рекомендуется явно объявлять тип данных для каждого аргумента конструктора, чтобы избежать проблемы неоднозначности типа внедрения конструктора, описанной выше.