プロパティファイルからコンストラクタパラメータにBean型を注入する際に問題があります。 次のように値を@Qualifier( "beanName")に直接渡すことで注入できます。プロパティプレースホルダを使用してコンストラクタパラメータにSpringアノテーションを使用してBeanを注入する
@Component("circle")
public class Circle implements Shape {
}
@RestController
class MyController {
private final Shape shape;
@Autowired
public MyClass(@Qualifier("circle")
Shape shape) {
this.shape = shape;
}
}
ただし、以下のコードサンプルは機能しません。
Nullを返します。
" '@Resource' は適用されないパラメータを" ここに( Spring: Using @Qualifier with Property Placeholder) を述べたが、コンパイラエラー を得るよう@Qualifierの代わりに@Resource(名前= "$ {形}を")を使用してみました
@Resourceは( "$ {形}")
これはあまりにも動作しません "を法 'の値' が見つかりません" というエラー を与える:
@RestController
class MyController {
@Value("${shape}")
private final String shapeBean; //Compiler error : "Variable 'shapeBean' might not have been initialised"
//Not declaring shapeBean as final will give a compiler error at @Qualifier: "Attribute value must be constant"
private final Shape shape;
@Autowired
public MyClass(@Qualifier(shapeBean)
Shape shape) {
this.shape = shape;
}
}
以下のコードは機能しません。 @Qualifierでコンパイラエラーが発生しました: "属性値は一定でなければなりません"。
@RestController
class MyController {
@Value("${shape}")
private final String shapeBean;
private final Shape shape;
@Autowired
public MyClass(@Qualifier(shapeBean)
Shape shape) {
this.shape = shape;
}
}
次も試しました。シェイプにアクセスしようとすると、両方ともNullPointerExceptionがスローされます。
コンストラクタパラメータがプリミティブまたは文字列だった場合、@Value( "$ {shape}")を使用してその値を変数に挿入できます。しかしそれはクラスなので、それをどうやって行うのかは分かりません。
私が間違って設定したか、私が何をすべきか教えてもらえますか?
実行時に異なる図形を選択したいと思っていますか?一般的に言えば、そのようなプロファイルのようなものを使用します。あなたはあなたの実際のアプリケーションについてより具体的になりますか? – chrylis
上記の例では、シェイプインターフェイスと、シェイプを実装する具象クラスがあります。しかし今は私のコントローラーでは、Shapeオブジェクトに円の形だけを注入します。 @Qualifier( "circle")を使用していましたが、これは完全に機能していました。しかし、私はそれをハードコードしておきたくないので、プロパティファイルから取得したいと思います。プロパティファイルから値を取得し、その値をShapeオブジェクトに挿入する方法はありますか? – Arthas