Spring .propertiesファイル:要素を配列として取得


91

.properties次のように、Springを使用してファイルからプロパティ属性をロードしています:

file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6

Spring XMLファイル

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>

そして私のClass.java

file: Class.java
public void setProperty(final List<Integer> elements){
    this.elements = elements;
}

しかし、デバッグ時には、パラメーター要素はリストの最後の要素のみを取得するため、6つの要素を持つリストではなく、値が「6」の1つの要素のリストがあります。

値だけを追加するなど、他の方法を試し#{base.module}ましたが、プロパティファイルでパラメータが見つかりません。

回避策は、次のように、elements.propertiesファイルにカンマで区切られたリストを含めることです。

base.module.elementToSearch=1,2,3,4,5,6

文字列として使用して解析しますが、より良い解決策はありますか?



だから私はそれをコンマ区切りの文字列として渡し、メソッドで解析する必要があります。
RamonBoza

正確には、あなたのためにすでにそれを行っているいくつかのライブラリがありますが(apache commons)-commons.apache.org/configuration/howto_properties.html
Colin Hebert

これは、少なくともSet <String>結果を返す答えです。List <String>ではありませんが、多くの場合はおそらく十分です!stackoverflow.com/questions/5274362/...
ジョン・リックス

回答:


189

次のようにプロパティファイルで配列を定義すると、

base.module.elementToSearch=1,2,3,4,5,6

このような配列を次のようにJavaクラスにロードできます。

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;

5
要素にカンマが含まれています。セパレータをエスケープするにはどうすればよいですか?「\」、「\\」も機能しません。
banterCZ 2012年

それらを整数のリストとして取得してから、それらを@Value( "$ {base.module.elementToSearch}")private List <Integer> elementToSearchに変換してみることができます。
Gal Bracha

+1、必要なものだけ。残念ながらList<String>、同じ方法でカンマ区切りの値をa に読み取っても機能しないようです(リストには要素が1つしかありません)。
Jonik 2013年

4
String[]as typeを使用List<String>しても機能しないことを確認できます。
Wim Deblauwe 2014

2
これをのList<String>代わりに使用したい場合はString[]、少なくともをに追加する必要があり<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">ますapplicationContext.xml。それ以外の場合は、変換サービスが使用されるが、コレクションにのみ配列を文字列に変換するサポートしていないデフォルトのプロパティエディタ、されていません:docs.spring.io/spring/docs/current/spring-framework-reference/...
クレメンスクライン-Robbenhaar

36

また、カンマ以外の別の区切り文字を使用する場合は、それも使用できます。

@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues;   // could also be a List<String>

そして

あなたが持つことができるあなたのアプリケーションのプロパティで

my.config.values=value1, value2, value3

この使用法は他のアノテーションでも機能し、@ KafkaListener {topics = "#{'$ {ArrayProperty}'。split( '、')}"}のように使用して、春のカフカリスナー
AsyncTask

32

これは、Spring 4.0以降でこれを行う方法の例です。

application.properties コンテンツ:

some.key=yes,no,cancel

Javaコード:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);

これは私が欲しいものですが、環境変数では...環境変数でSOME_KEY_0_ = yes SOME_KEY_1 = noなどを使用できるはずですが、私のgetPropertyはnullに戻ります
Rhubarb

0

Spring Bootを使用すると、次のことができます。

application.properties

values[0]=abc
values[1]=def

構成クラス

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@ConfigurationProperties
public class Configuration {

    List<String> values = new ArrayList<>();

    public List<String> getValues() {
        return values;
    }

}

これは、このクラスなし、またはクラス内で機能しない場合に必要ですvalues

Spring Boot Applicationクラス

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;

@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {

    private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);

    // notice #{} is used instead of ${}
    @Value("#{configuration.values}")
    List<String> values;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConsoleApplication.class, args);
    }

    @Override
    public void run(String... args) {
        LOG.info("values: {}", values);
    }

}

0

アスタリスク記号を渡す必要がある場合は、引用符で囲む必要があります。

私の場合、websocketのcorsを構成する必要があります。そこで、corsのURLをapplication.ymlに入れることにしました。製品環境では特定のURLを使用しますが、開発環境では*だけを使用してもかまいません。

ymlファイルで私は:

websocket:
  cors: "*"

Configクラスには次のものがあります。

@Value("${websocket.cors}")
private String[] cors;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.