Ambiguïtés de type injection constructeur au printemps
Dans le framework Spring, lorsque votre classe contient plusieurs constructeurs avec le même nombre d'arguments, cela provoquera toujours le problèmeconstructor injection argument type ambiguities.
Problème
Voyons cet exemple de bean client. Il contient deux méthodes constructeur, les deux acceptent 3 arguments avec un type de données différent.
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; } }
Dans le fichier de configuration Spring bean, transmettez un "exemple" pour le nom, "188" pour l'adresse et "28" pour l'âge.
example 188 28
Exécutez-le, quel est votre résultat attendu?
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); } }
Sortie
name : example address : 28 age : 188
Le résultat n'est pas ce que nous attendions, le deuxième constructeur est exécuté, au lieu du premier constructeur. Dans Spring, le type d'argument «188» est capable de se convertir en entier, donc Spring le convertit simplement et prend le deuxième constructeur, même si vous supposez qu'il doit s'agir d'une chaîne.
En outre, si Spring ne parvient pas à déterminer le constructeur à utiliser, le message d'erreur suivant s'affiche.
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)
Solution
Pour le corriger, vous devez toujours spécifier le type de données exact pour le constructeur, via l'attribut type comme ceci:
example 188 28
Exécutez-le à nouveau, maintenant vous obtenez ce que vous attendiez.
Sortie
name : example address : 188 age : 28
Note
C’est toujours une bonne pratique de déclarer explicitement le type de données pour chaque argument de constructeur, pour éviter les ambiguïtés de type d’injection de constructeur ci-dessus.