12

春にコンストラクターとして渡す必要がある値 aa bb cc dd ee ff gg などの大きなリストがあるとします。

文字列配列として構成する必要がある場合、aa、bb、cc などのカンマ区切りで値を指定するだけでよいので、Spring では簡単です。

リストとして設定する必要がある場合は、以下のようにする必要があります

<bean name="myBean" class="MyClass">
    <constructor-arg>
        <list>
            <value>aa</value>
            <value>bb</value>
            <value>cc</value>
            <value>dd</value>
        </list>
    </constructor-arg>
</bean>

値の数が増えると、巨大な行を占有し、見苦しくなります。

大きな値をコンストラクターとして文字列のリストとして渡す方法を教えてください。

4

5 に答える 5

22

プロパティファイルからリストに渡される値はありますか?もしそうなら、あなたはこのようなものを使うことができます:

<bean name="myBean" class="MyClass">
   <constructor-arg>
      <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
          <constructor-arg type="java.lang.String" value="${list.value}"/>
      </bean>
    </constructor-arg>
</bean> 

次の.propertiesファイルを使用

list.value=aa,bb,cc,dd   

そうでない場合は、どうやらそれを直接渡すことができます:

<bean name="myBean" class="MyClass">
   <constructor-arg>
      <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
          <constructor-arg type="java.lang.String" value="aa,bb,cc,dd"/>
      </bean>
    </constructor-arg>
</bean> 
于 2012-07-20T11:33:55.080 に答える
13

Spring は、カンマ区切りの文字列を自動的にリストまたは配列に変換できます。

public class Foo {
   public void setValueList(String[] values) { ... }
}

<bean class="Foo"
      p:valueList="a,b,c,d" />
<bean class="Foo"
      c:_0="a,b,c,d" />
<bean class="Foo">
     <constructor-arg><value>a,b,c,d</value></constructor-arg>
</bean>

実際、値が 1 つしかなく、文字列にカンマがない場合でも、機能します。

誰かが別の回答で言及した org.springframework.util.StringUtils への呼び出しは必要ありません。

これは、コンストラクター引数も意味します (c:_0 は、c 名前空間を使用する <constructor-arg index="0"> の省略形です。

于 2012-07-20T14:06:05.130 に答える
5

さらに単純なことを試して、Spring 式言語を使用して値をリストに変換することもできます。

<bean name="myBean" class="MyClass">
    <constructor-arg value="#{T(java.util.Arrays).asList('${list.values}')}"/>
</bean>
于 2015-05-22T12:41:45.483 に答える
2

最新の Spring フレームワーク バージョン (Spring 3.1+ だと思います) を使用している場合、SpringEL で文字列を分割する必要はありません。

Spring の Configuration クラス ( Configuration で注釈が付けられたクラス) に PropertySourcesPlaceholderConfigurer と DefaultConversionService を追加するだけです。

@Configuration
public class AppConfiguration {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean public ConversionService conversionService() {
        return new DefaultConversionService();
    }
}

そしてあなたのクラスで

@Value("${list}")
private List<String> list;

または、それが必要な場合は、コンストラクターのパラメーターで @Value アノテーションを使用します。

最後にプロパティファイルに

list=A,B,C,D,E

DefaultConversionService を使用しない場合、値をフィールドに挿入するときにカンマ区切りの文字列を文字列配列にすることしかできませんが、DefaultConversionService はいくつかの便利な魔法を実行し、それらをコレクション、配列などに追加します (必要な場合は実装を確認してください)。それについてもっと知りたい)

これら 2 つを使用すると、改行を含むすべての冗長な空白も処理されるため、空白を削除するために追加のロジックを追加する必要はありません。

于 2018-11-16T04:14:31.113 に答える
0

コンマ区切りの文字列を引数として取るコンストラクタを実装できます (そして、その文字列を自分で値に分割します)。

任意のコンストラクター/プロパティで機能するソリューションが必要な場合は、独自の実装を検討し、それPropertyEditorを使用するように Spring を構成できます。

于 2012-07-20T11:15:47.170 に答える