Ambiguïtés du type d’injection de constructeur au printemps

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.