문자열 목록을위한 Spring Boot yaml 구성


149

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}"

답변:


71

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

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

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

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


1
쉼표로 구분 된을 묶을 수 있습니다 @Value(변환기가 등록되어 있으면 Spring Boot에있을 것입니다).
Dave Syer

2
그것은 문자열을 설정하지만 목록 <문자열> 설정 따기
Bahadır 야건을

1
나는 그것을 사용할 수 @Configuration없었지만 @Component대신 사용 하여 속임수를 썼다.
Stijn Van Bael

1
@cfrick 예, 내가 만든 유일한 변경이었습니다. 두 주석의 목적을 살펴보면 @Component더 적절 하다고 말할 수 있습니다. stackoverflow.com/questions/12229282/…
Stijn Van Bael

2
-이 같은이 모습은 주석 봄 부트 프로세스와 제한 사항입니다 github.com/spring-projects/spring-boot/issues/501
wontondon

134

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

ignoreFilenames: .DS_Store, .hg

액세스를위한 자바 코드

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

작동 중입니다.)


나는 이것이 Dropwizard에서도 작동하기를 바랐습니다 : '(감사합니다!
RST

1
그게 가장 좋은 대답이었습니다.
Mohamed Elsayed

3
내 테스트에서 이것은 ".DS_Store, .hg"와 동일하지만 ".DS_Store", ".hg"와는 다릅니다. 후자는 "org.yaml.snakeyaml.parser.ParserException : 블록 매핑 구문 분석 중"으로 실패합니다. 따라서 실제로 여기서하는 일은 YAML 배열 대신 단일 쉼표로 구분 된 문자열 (Spring이 배열 또는 목록으로 분할)로 속성을 제공하는 것입니다. 이 "작동"하지만 원래 질문에 대답하지 않습니다. @Value 주석이 달린 빈 속성에서 YAML 배열을 구문 분석하는 방법을 아직 찾지 못했습니다.
Zirzirikos

38

스프링 부트 문서에서 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;
    }
}

2
BTW getXxx()가 작동하려면 작동해야하며 BTW 는 작동 List하지 않아야 Set합니다.
Eric Wang

yaml에서 ArrayList의 값 목록은 쉼표로 구분 된 목록 일 수 있습니다. 필자의 경우 값이 많으므로 한 줄에있는 항목보다 간단한 목록이 더 깨끗합니다. 예를 들어 dev.bar.com, foo.bar.com
Violaman

25

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

application.yml :

ignoreFilenames: >
  .DS_Store, 
  .hg

자바 코드 :

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

문자열에 더 이상 쉼표 (,)가없는 한 잘 작동합니다.
Valentin Despa

속성을 arraylist로 읽는 데는 작동하지 않습니다. 단일 문자열로 읽습니다.
Sree Lakshmi

6

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;

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


작동합니다. 내 경우에는 응용 프로그램이 실패했지만 @Configuration의 클래스 시작 부분에 추가하지 않는 한 ConfigProvider.java. 그렇지 않으면 소스에 찾을 수없는 'java.util.List'유형의 Bean이 필요합니다.
Diana

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

yml 파일 :

your:
 elements: element1, element2, element3

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


2

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

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

-1

필자의 경우 이것은 .yml 파일의 구문 문제였습니다. 나는했다 :

@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;

내 .yml 파일의 목록 :

bootstrap-servers:
  - s1.company.com:9092
  - s2.company.com:9092
  - s3.company.com:9092

@ Value-annotated 필드를 읽지 못했습니다. .yml 파일의 구문을 다음과 같이 변경하면

bootstrap-servers >
  s1.company.com:9092
  s2.company.com:9092
  s3.company.com:9092

잘 작동했습니다.


spring-boot 1.5에서 이것을 시도하면 작동하지 않습니다. 부트 스트랩 서버 후에 콜론이 필요합니다
Taugenichts

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.