[java] 속성 파일에서 목록을 읽고 스프링 주석 @Value로로드

.properties 파일에 값 목록을 갖고 싶습니다.

my.list.of.strings=ABC,CDE,EFG

그리고 내 수업에 직접로드하려면 :

@Value("${my.list.of.strings}")
private List<String> myList;

내가 이해하는 것처럼, 이것을 수행하는 대안은 그것을 스프링 설정 파일에 넣고 빈 참조로로드하는 것입니다 (잘못된 경우 수정하십시오).

<bean name="list">
 <list>
  <value>ABC</value>
  <value>CDE</value>
  <value>EFG</value>
 </list>
</bean>

그러나 이것을 수행하는 방법이 있습니까? .properties 파일을 사용합니까? 추신 : 가능한 경우 사용자 정의 코드 없이이 작업을 수행하고 싶습니다.



답변

스프링 EL 사용하기 :

@Value("#{'${my.list.of.strings}'.split(',')}")
private List<String> myList;

다음과 같이 특성 파일이 올바르게로드되었다고 가정하십시오.

my.list.of.strings=ABC,CDE,EFG


답변

Spring 3.0부터 다음과 같은 줄을 추가 할 수 있습니다

<bean id="conversionService"
    class="org.springframework.context.support.ConversionServiceFactoryBean" />

당신 applicationContext.xml(또는 당신이 물건을 구성하는 곳)에. Dmitry Chornyi가 주석에서 지적한 것처럼 Java 기반 구성은 다음과 같습니다.

@Bean public ConversionService conversionService() {
    return new DefaultConversionService();
}

이것은 다음으로의 변환 String을 지원하는 새로운 구성 서비스를 활성화합니다Collection 유형 . 이 구성 서비스를 활성화하지 않으면 Spring은 레거시 속성 편집기를 구성 서비스로 대체하여 이러한 종류의 변환을 지원하지 않습니다.

다른 유형의 컬렉션으로 변환해도 작동합니다.

@Value("${my.list.of.ints}")
private List<Integer> myList

같은 라인으로 작동합니다

 my.list.of.ints= 1, 2, 3, 4

공백에는 문제가 없습니다. ConversionServiceFactoryBean 처리합니다.

참조 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config를

Spring 애플리케이션에서는 일반적으로 Spring 컨테이너 (또는 ApplicationContext)마다 ConversionService 인스턴스를 구성합니다. 해당 ConversionService는 Spring에서 픽업 한 다음 프레임 워크에서 유형 변환을 수행해야 할 때마다 사용됩니다. […] Spring에 ConversionService가 등록되어 있지 않으면 원래 PropertyEditor 기반 시스템이 사용됩니다.


답변

이 내용을 읽고 Spring Boot를 사용 하는 경우이 기능에 대한 추가 옵션이 1 개 있습니다

일반적으로 쉼표로 구분 된 목록은 실제 사용 사례에서 매우 어색합니다 (그리고 구성에서 쉼표를 사용하려는 경우 때로는 불가능합니다).

email.sendTo=somebody@example.com,somebody2@example.com,somebody3@example.com,.....

Spring Boot를 사용하면 다음과 같이 작성할 수 있습니다 (Index start at 0) :

email.sendTo[0]=somebody@example.com
email.sendTo[1]=somebody2@example.com
email.sendTo[2]=somebody3@example.com

다음과 같이 사용하십시오.

@Component
@ConfigurationProperties("email")
public class EmailProperties {

    private List<String> sendTo;

    public List<String> getSendTo() {
        return sendTo;
    }

    public void setSendTo(List<String> sendTo) {
        this.sendTo = sendTo;
    }

}


@Component
public class EmailModel {

  @Autowired
  private EmailProperties emailProperties;

  //Use the sendTo List by 
  //emailProperties.getSendTo()

}



@Configuration
public class YourConfiguration {
    @Bean
  public EmailProperties emailProperties(){
        return new EmailProperties();
  }

}


#Put this in src/main/resource/META-INF/spring.factories
  org.springframework.boot.autoconfigure.EnableAutoConfiguration=example.compackage.YourConfiguration


답변

my.list.of.strings=ABC,CDE,EFGin .properties 파일 을 지정하고

@Value("${my.list.of.strings}")
private String[] myString;

문자열 배열을 얻을 수 있습니다. 를 사용 CollectionUtils.addAll(myList, myString)하면 문자열 목록을 얻을 수 있습니다.


답변

@Autowired생성자 또는 세터 String.split()를 사용하고 본문 을 고려한 적이 있습니까?

class MyClass {
    private List<String> myList;

    @Autowired
    public MyClass(@Value("${my.list.of.strings}") final String strs) {
        myList = Arrays.asList(strs.split(","));
    }

    //or

    @Autowired
    public void setMyList(@Value("${my.list.of.strings}") final String strs) {
        myList = Arrays.asList(strs.split(","));
    }
}

내 코드의 테스트 가능성을 향상시키기 위해 다음 방법 중 하나로 자동 배선을 선호합니다.


답변

Spring Boot 2를 사용하는 경우 추가 구성없이 그대로 작동합니다.

my.list.of.strings=ABC,CDE,EFG

@Value("${my.list.of.strings}")
private List<String> myList;


답변

위의 모든 답변이 정확합니다. 그러나 한 줄로만 달성 할 수 있습니다. 다음 선언을 시도하면 쉼표로 구분 된 모든 값이 문자열 목록에 표시됩니다.

private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List<String> myList;

또한 XML 구성에 다음 줄이 정의되어 있어야합니다.

<util:properties id="projectProperties" location="/project.properties"/>

속성 파일의 경로와 파일 이름을 바꾸십시오. 그리고 당신은 갈 수 있습니다. 🙂

이것이 도움이되기를 바랍니다. 건배.