Spring .properties 파일 : 요소를 배열로 가져 오기


94

.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

스프링 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"인 한 요소의 목록이 있습니다.

값만 추가하는 것과 같은 다른 접근 방식을 시도했지만 #{base.module}속성 파일에서 매개 변수를 찾지 못했습니다.

해결 방법은 다음과 같이 쉼표로 구분 된 목록을 elements.properties 파일에 포함하는 것입니다.

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

그것을 String으로 사용하고 구문 분석하지만 더 나은 솔루션이 있습니까?



그래서 쉼표로 구분 된 문자열로 전달하고 메서드에서 구문 분석해야합니다.
RamonBoza 2011 년

정확하지만 이미 당신을 위해 그렇게하는 libs가 있지만 (apache commons) -commons.apache.org/configuration/howto_properties.html
Colin Hebert

다음은 최소한 Set <String> 결과를 ​​제공하는 답변입니다. List <String>은 아니지만 많은 경우에 충분할 것입니다! stackoverflow.com/questions/5274362/…
John Rix

답변:


193

다음과 같이 속성 파일에 배열을 정의하면

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

다음과 같이 Java 클래스에서 이러한 배열을로드 할 수 있습니다.

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

5
내 요소에는 쉼표가 있습니다. 구분 기호를 어떻게 이스케이프합니까? '\', '\\'도 작동하지 않습니다.
banterCZ 2010 년

정수 목록으로 가져 와서 변환 할 수 있습니다. @Value ( "$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Gal Bracha

+1, 내가 필요한 것만. 불행히도 쉼표로 구분 된 값을 List<String>같은 방식 으로 읽는 것은 작동하지 않는 것 같습니다 (목록에는 하나의 요소 만 있음).
Jonik

5
String[]사용 List<String>이 안되는 곳에서 유형으로 사용하는 것이 작동 함을 확인할 수 있습니다 .
Wim Deblauwe 2014

3
당신이 일이 원하는 경우 List<String>대신 String[], 당신은 적어도를 추가 할 필요가 <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">당신에 applicationContext.xml. 그렇지 않으면 변환 서비스가 사용되지 않지만 문자열을 컬렉션으로 변환하는 것을 지원하지 않는 기본 속성 편집기, 배열 만 : docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar

37

그리고 쉼표 이외의 다른 구분 기호를 사용하는 경우에도 사용할 수 있습니다.

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

응용 프로그램 속성에서

my.config.values=value1, value2, value3

이 사용법은 다른 어노테이션에서도 작동합니다. 저는 스프링 kafka 리스너에 대해 @KafkaListener {topics = "# { '$ {ArrayProperty}'. split ( ',')}"}와 같이 사용했습니다
AsyncTask

32

다음은 Spring 4.0 이상에서 수행 할 수있는 방법의 예입니다.

application.properties 함유량:

some.key=yes,no,cancel

자바 코드 :

@Autowire
private Environment env;

...

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

이것이 내가 원하는 것이지만 env vars에서 ... env vars에서 SOME_KEY_0_ = yes SOME_KEY_1 = no 등을 사용할 수 있어야하지만 getProperty가 null로 돌아옵니다
Rhubarb

1

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 애플리케이션 클래스

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

별표 기호를 전달해야하는 경우 따옴표로 묶어야합니다.

제 경우에는 웹 소켓에 대한 cors를 구성해야합니다. 그래서 cors URL을 application.yml에 넣기로 결정했습니다. prod env의 경우 특정 URL을 사용하지만 dev의 경우 * 만 사용하는 것이 좋습니다.

yml 파일에는 다음이 있습니다.

websocket:
  cors: "*"

Config 클래스에는 다음이 있습니다.

@Value("${websocket.cors}")
private String[] cors;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.