2016-05-23 12 views
0

プロパティファイルからコンストラクタパラメータに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}")を使用してその値を変数に挿入できます。しかしそれはクラスなので、それをどうやって行うのかは分かりません。
私が間違って設定したか、私が何をすべきか教えてもらえますか?

+0

実行時に異なる図形を選択したいと思っていますか?一般的に言えば、そのようなプロファイルのようなものを使用します。あなたはあなたの実際のアプリケーションについてより具体的になりますか? – chrylis

+0

上記の例では、シェイプインターフェイスと、シェイプを実装する具象クラスがあります。しかし今は私のコントローラーでは、Shapeオブジェクトに円の形だけを注入します。 @Qualifier( "circle")を使用していましたが、これは完全に機能していました。しかし、私はそれをハードコードしておきたくないので、プロパティファイルから取得したいと思います。プロパティファイルから値を取得し、その値をShapeオブジェクトに挿入する方法はありますか? – Arthas

答えて

0

CircleにShapeで定義されているすべてのメソッドが実装されていませんか? - 形の契約が満たされている限り、あなたは大丈夫です。 Triangle、Rectangle、およびCircleという複数の図形が存在し、何らかの理由で正確なサブクラスを動的にロードしたい場合は、ApplicationContext.getBean( "")を使用して特定のBeanを取得することができます。

afterPropertiesSet()をオーバーライドすることによって、さまざまな形状への参照を維持できます。InitialingBeanを見て、実行時には正しいBeanを使用します。

+0

今のところサークルが提供するサービスを利用しています。ある時点で、私は_Circle_によって提供されるサービスを中止し、_Triangle_によって提供されるサービスに加入するかもしれません。したがって、修正プログラムとして、私のコントローラに宣言するのではなく、サービスプロバイダをプロパティファイルで宣言したいと考えています。注釈を使用してプロパティ値を割り当てる方法はありますか? – Arthas

+0

はい、最も簡単な方法は、スプリングプロファイルを使用してspring.profile.active env変数に基づいて一連のBeanをアクティブにすることです。シンプルなチュートリアルは https:// springの下にあります。io/blog/2011/02/14/spring-3-1-m1-introduction-profile/ http://www.mkyong.com/spring/spring-profiles-example/ – JVXR

関連する問題