[spring-boot] 문자열 목록을위한 Spring Boot yaml 구성

application.yml 파일에서 문자열 배열을로드하려고합니다. 이것은 구성입니다 :

ignore:
    filenames:
        - .DS_Store
        - .hg

이것은 클래스입니다 :

@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();

동일한 클래스에는 다른 구성이 잘로드됩니다. 내 yaml 파일에 탭이 없습니다. 여전히 다음 예외가 발생합니다.

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"



답변

추측으로는 (가) 있다는 것입니다 @Value“복잡한”유형에 대처할 수 없습니다. 다음과 같은 소품 클래스를 사용할 수 있습니다.

@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
    List<String> filenames
}

제발 참고 : 이 코드는 그루비하지 자바 예제 짧은 유지 -! 채택 방법에 대한 정보는 의견을 참조하십시오.

전체 예제를 참조하십시오 https://github.com/christoph-frick/so-springboot-yaml-string-list


답변

application.yml에서 쉼표로 구분 된 값을 사용하십시오.

ignoreFilenames: .DS_Store, .hg

액세스를위한 자바 코드

@Value("${ignoreFilenames}")
String[] ignoreFilenames

작동 중입니다.)


답변

스프링 부트 문서에서 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

YAML 목록은 [index] 역 참조자가있는 속성 키로 표시됩니다 (예 : 다음 YAML).

my:
   servers:
       - dev.bar.com
       - foo.bar.com

다음과 같은 속성으로 변환됩니다.

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

Spring DataBinder 유틸리티를 사용하는 것과 같은 속성에 바인딩하려면 @ConfigurationProperties유형의 대상 Bean에 속성이 java.util.List있어야하고 setter를 제공하거나 변경 가능한 값으로 초기화해야합니다. 예를 들면 다음과 같습니다. 위의 속성에. 질문 코드는 다음과 같습니다.

@ConfigurationProperties(prefix="ignore")
public class Filenames {

    private List<String> ignoredFilenames = new ArrayList<String>();

    public List<String> getFilenames() {
        return this.ignoredFilenames;
    }
}


답변

Ahmet의 답변 외에도 >기호를 사용하여 쉼표로 구분 된 문자열에 줄 바꿈을 추가 할 수 있습니다 .

application.yml :

ignoreFilenames: >
  .DS_Store,
  .hg

자바 코드 :

@Value("${ignoreFilenames}")
String[] ignoreFilenames;


답변

Ahmet의 답변 은 쉼표로 구분 된 값을 문자열 배열에 할당하는 방법을 제공합니다.

다른 클래스에서 위의 구성을 사용하려면이를 위해 getter / setter를 작성해야 할 수도 있습니다. 그러나이 구성을 한 번로드하고이를 Autowired 어노테이션이있는 Bean으로 계속 사용하려면 다음과 같이하십시오.

ConfigProvider.java에서

@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
    return new ArrayList<String>();
}

외부 수업에서 :

@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;

자동 배선을 통해 다른 곳에서도 동일한 목록을 사용할 수 있습니다.


답변

@Value("#{'${your.elements}'.split(',')}")
private Set<String> stringSet;

yml 파일 :

your:
 elements: element1, element2, element3

스프링 SPEL로 더 많은 것을 할 수 있습니다.


답변

글쎄, 내가 작동시킬 수있는 유일한 것은 다음과 같습니다.

servers: >
    dev.example.com,
    another.example.com

@Value("${servers}")
private String[] array;

그리고 클래스 위의 @Configuration을 잊지 마십시오 ….

“,”분리 없이는 그런 운이 없다 …

작동합니다 (boot 1.5.8 versie)

servers:
       dev.example.com,
       another.example.com