Рубрики
Без рубрики

Неоднозначности типа инъекции конструктора весной

– Неоднозначности типа инъекции конструктора весной

В 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/”