Springのコンストラクター注入型のあいまいさ
Springフレームワークでは、クラスに同じ数の引数を持つ複数のコンストラクターが含まれていると、常にconstructor injection argument type ambiguitiesの問題が発生します。
問題
この顧客Beanの例を見てみましょう。 2つのコンストラクターメソッドが含まれており、どちらも異なるデータ型の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; } }
Spring Bean構成ファイルで、名前に「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
結果は期待したものではなく、最初のコンストラクターではなく、2番目のコンストラクターが実行されます。 Springでは、引数タイプ「188」はintに変換できるため、Springはそれを変換し、2番目のコンストラクターを取得します。これは、ストリングであると仮定してもです。
さらに、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
上記のコンストラクター注入タイプのあいまいさの問題を回避するために、コンストラクター引数ごとにデータ型を明示的に宣言することは常に良い習慣です。