2016-03-19 4 views
5

に動作することは、私はArrayListの春のBean定義があるとします。ListにSpringのインスタンスを挿入するにはどうすればいいですか?

<bean id="availableLanguages" class="java.util.ArrayList"> 
    <constructor-arg> 
     <bean class="java.util.Arrays" factory-method="asList"> 
      <constructor-arg> 
       <list> 
        <value>de</value> 
        <value>en</value> 
       </list> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 

今、私は、例えば、豆のすべての種類にこれを注入することができこのように:

@Controller 
class Controller { 
    @Autowired 
    public Controller(ArrayList<String> availableLanguages) { 
     // ... 
    } 
} 

これは素晴らしいです。代わりに、次に

@Controller 
class Controller { 
    @Autowired 
    public Controller(List<String> availableLanguages) { 
     // ... 
    } 
} 

私はタイプStringのすべてのBeanのリストを得る:それは私が私のコントローラの小さなビットを変更し、タイプListの代わりに、このようなArrayListを使用する場合は

を破る方法

私が定義したbeanではなく、むしろ。しかし、実際には私のリストを変更不可能なリストにまとめたいのですが、これは私の依存関係をリストにダウングレードする場合にのみ可能です。

これまで発見された回避策

次のXMLファイル:

<bean id="availableLanguages" class="java.util.Collections" factory-method="unmodifiableList"> 
    <constructor-arg> 
     <bean class="java.util.Arrays" factory-method="asList"> 
      <constructor-arg> 
       <list> 
        <value>de</value> 
        <value>en</value> 
       </list> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 

は、このコントローラと一緒に動作します:

@Controller 
class Controller { 
    @Autowired 
    public Controller(Object availableLanguages) { 
     List<String> theList = (List<String>)availableLanguages; 
    } 
} 

これは、余分な型キャストが醜いです動作しますが。

調査結果は、これまで

私はすべての問題を引き起こすように見えるspecial handling for collections in Spring 4.2.5 (the currently most recent version)があることを考え出しました。パラメータがCollectionを拡張するインタフェースである場合、特別な動作が作成されます。したがって、Objectまたは具体的な実装をパラメータタイプとして使用することで回避策を講じることができます。

質問

リストを直接Beanに挿入する方法はありますか?どうやって?

+0

名前空間 'util'を使用できます。 [this](http://stackoverflow.com/questions/2416056/how-to-define-a-list-bean-in-spring)asnwerを見てください。 – josivan

+0

@ josivan:私が見る限り、これはリストの定義方法を変えるでしょう。しかし、リストの定義は問題ではありません。それは問題を引き起こす注射ですか、私は 'util'が何をしているのか分からないのですか? – yankee

+0

'util:list'はSpringコンテキストの通常のBeanです。普通に注入できます。アノテーションとXMLが混在しており、コンストラクタで '@修飾子 'を使用するようになっています。例えば ​​'@Qualifier(" myList ")' – josivan

答えて

0

@Qualifierを使用すると、指定された修飾子を持つBeanが注入されます。 Beanにしたいリストに名前を付けると、うまく動作します。

関連する問題