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

.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으로 사용하고 구문 분석하지만 더 나은 솔루션이 있습니까?



답변

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

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

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

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


답변

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

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

응용 프로그램 속성에서

my.config.values=value1, value2, value3


답변

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

application.properties 함유량:

some.key=yes,no,cancel

자바 코드 :

@Autowire
private Environment env;

...

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


답변

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);
    }

}


답변

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

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

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

websocket:
  cors: "*"

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

@Value("${websocket.cors}")
private String[] cors;


답변