3

私のGrailsアプリでresources.groovyは、Map型のコンストラクター引数を必要とするSpringBeanを定義しようとしています。私はこれを試しました:

Map<Class, String> mapArg = [(String): 'foo']
myBean(MyBeanImpl, mapArg)

しかし、エラーメッセージが表示されます。

org.springframework.beans.factory.BeanCreationException:「myBean」という名前のBeanの作成中にエラーが発生しました:一致するコンストラクターを解決できませんでした(ヒント:型のあいまいさを避けるために、単純なパラメーターのインデックス/型/名前の引数を指定してください)

実装クラスには、このように定義された単一のコンストラクターがあります

MyBeanImpl(Map<Class, String> map) {
  // impl omitted 
}

私の推測では、この問題は、MapGroovyがすべてのクラスに追加するデフォルトのコンストラクターと同じシグネチャを持つ単一の引数をとるコンストラクターを定義したという事実が原因であると推測されます。

もしそうなら、解決策は次のようなファクトリメソッドを追加することであるように見えます

MyBean getInstance(Map map) {
  // impl omitted  
}

resources.groovyしかし、これをどのように呼び出して、パラメーターを必要とするファクトリメソッドから構築されたBean(in)を定義できるかわかりません。

4

1 に答える 1

4

私が知る限り、あなたが使用している構文は機能するはずです。代替構文は次のとおりです。

Map<Class, String> mapArg = [(String): 'foo']
myBean(MyBeanImpl) { bean ->
  bean.constructorArgs = [mapArg]
}

あなたの場合はうまくいきますか?それができない場合は、マップをそれ自体で Bean として宣言することで、確実にそれを行う必要があります。

import org.springframework.beans.factory.config.MapFactoryBean

classMap(MapFactoryBean) {
  sourceMap = [(String):'foo']
}

myBean(MyBeanImpl, classMap /* this is a RuntimeBeanReference */)
于 2012-09-07T15:04:32.593 に答える