속성 파일에서 목록 읽기 및 스프링 주석 @Value 로딩
.properties 파일에 값 목록을 가지고 싶다.
my.list.of.strings=ABC,CDE,EFG
내 수업 시간에 직접 로드하려면:
@Value("${my.list.of.strings}")
private List<String> myList;
다른 방법으로 스프링 구성 파일에 저장하고 bean reference로 로드합니다(잘못된 경우 정정).
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
하지만 이걸 할 방법은 없을까?.properties 파일을 사용하시겠습니까?ps: 가능하다면 어떤 커스텀 코드도 사용하지 않고 하고 싶습니다.
스프링 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" />
your applicationContext.xml
( ( ( ( ( ( ( )드미트리 초르니
@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 인스턴스를 설정합니다.이 Conversion Service는 Spring에 의해 선택되고 프레임워크에서 유형 변환을 수행해야 할 때마다 사용됩니다.[...] Spring에 등록된 Conversion Service가 없는 경우 원래 PropertyEditor 기반 시스템이 사용됩니다.
이 내용을 읽고 스프링 부트를 사용하는 경우 이 기능에 대한 옵션이1개 더 있습니다.
일반적으로 콤마 구분 리스트는 실제 사용 예에서는 매우 서툴러집니다(또한 설정에서 콤마를 사용하는 경우 실현 가능하지 않을 수도 있습니다).
email.sendTo=somebody@example.com,somebody2@example.com,somebody3@example.com,.....
Spring Boot에서는 다음과 같이 쓸 수 있습니다(인덱스는 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,EFG
및 .properties를 합니다.
@Value("${my.list.of.strings}")
private String[] myString;
을 사용법 ,, 용을 CollectionUtils.addAll(myList, myString)
을 사용법
Spring Boot 2 를 사용하고 있는 경우는, 추가의 설정 없이 그대로 동작합니다.
my.list.of.strings=ABC,CDE,EFG
@Value("${my.list.of.strings}")
private List<String> myList;
는 생각해 ?@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(","));
}
}
코드 테스트 가능성을 높이기 위해 다음 방법 중 하나를 사용하여 자동 연결을 수행하는 것을 선호하는 경향이 있습니다.
위의 답변은 모두 정답입니다.하지만 한 줄이면 이 일을 해낼 수 있습니다.다음 선언을 시도하면 문자열 목록에서 쉼표로 구분된 모든 값을 얻을 수 있습니다.
private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List<String> myList;
또한 xml 설정에서 다음 행을 정의해야 합니다.
<util:properties id="projectProperties" location="/project.properties"/>
속성 파일의 경로와 파일 이름만 바꾸면 됩니다.그리고 넌 가도 돼:)
도움이 되시길 바랍니다.건배.
최신 Spring Framework 버전(Spring 3.1+)을 사용하고 있다면 SpringEL에서 스트링 분할을 할 필요가 없습니다.
PropertySourcesPlaceholderConfigr 및 DefaultConversionService를 Spring의 Configuration 클래스(Configuration에 주석이 달린 클래스)에 추가합니다.다음은 예를 제시하겠습니다.
@Configuration
public class AppConfiguration {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean public ConversionService conversionService() {
return new DefaultConversionService();
}
}
그리고 너희 반에서
@Value("${list}")
private List<String> list;
및 속성 파일에
list=A,B,C,D,E
Default Conversion Service를 사용하지 않을 경우 필드에 값을 삽입할 때만 문자열을 콤마로 구분하여 문자열 배열로 만들 수 있습니다.단, Default Conversion Service는 몇 가지 편리한 기능을 수행하므로 수집, 어레이 등에 추가합니다(자세한 내용은 구현을 참조하십시오).
이 두 가지 기능을 사용하면 줄바꿈을 포함한 모든 용장화이트스페이스도 처리할 수 있기 때문에 이를 트리밍하기 위해 로직을 추가할 필요가 없습니다.
Spring Boot 2.2.6을 사용하고 있다.
내 속성 파일:
usa.big.banks= JP Morgan, Wells Fargo, Citigroup, Morgan Stanley, Goldman Sachs
내 코드:
@Value("${usa.big.banks}")
private List<String> bigBanks;
@RequestMapping("/bigbanks")
public String getBanks() {
System.out.println("bigBanks = " + bigBanks);
return bigBanks.toString();
}
잘 동작합니다.
이런 주석으로 이렇게 할 수 있습니다.
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings:a,b,c}')}")
private List<String> mylist;
여기서 my.list.of.mydl이 속성 파일에서 선택됩니다.속성 파일이 없을 경우 기본 a, b, c가 사용됩니다.
그리고 당신의 속성 파일에는 다음과 같은 것이 있습니다.
my.list.of.mydlist=d,e,f
값의 공백에 주의하십시오.틀릴 수도 있지만 쉼표로 구분된 목록의 공백은 @Value와 Spel을 사용하여 잘리지 않는다고 생각합니다.리스트
foobar=a, b, c
문자열 목록으로 읽힌다.
"a", " b", " c"
대부분의 경우 공간을 원하지 않을 수 있습니다!
표현
@Value("#{'${foobar}'.trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")
private List<String> foobarList;
에 문자열 목록이 표시됩니다.
"a", "b", "c".
정규식은 쉼표 직전과 직후의 모든 공간을 삭제합니다.값 내부의 공간은 제거되지 않습니다.그렇게
foobar = AA, B B, CCC
가치관을 낳아야 한다
"AA", "B B", "CCC".
어레이를 잡고 공간을 제거하는 것이 더 간단하다고 생각합니다.
@Value("#{'${my.array}'.replace(' ', '').split(',')}")
private List<String> array;
내 정수 목록의 경우 다음과 같이 작동합니다.
@Value("#{${my.list.of.integers}}")
private List<Integer> listOfIntegers;
속성 파일:
my.list.of.integers={100,200,300,400,999}
Commons Configuration 사용을 고려합니다.속성 파일의 항목을 배열/목록에 구분하는 기능이 내장되어 있습니다.SpEL과 @Value를 조합하면 원하는 것을 얻을 수 있습니다.
요청하신 대로 필요한 것은 다음과 같습니다(코드를 제대로 입력하지 않아서 오타가 날 수 있으니 조금만 참아주세요).
Apache Commons Configuration에는 Properties Configuration이 있습니다.구분된 문자열을 배열/목록으로 변환하는 기능을 지원합니다.
예를 들어 속성 파일이 있는 경우
#Foo.properties
foo=bar1, bar2, bar3
다음 코드와 함께:
PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties");
String[] values = config.getStringArray("foo");
의 문자열 배열이 표시됩니다.["bar1", "bar2", "bar3"]
Spring과 함께 사용하려면 앱 컨텍스트 xml에 다음과 같이 입력합니다.
<bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration">
<constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/>
</bean>
봄콩에 이걸 넣으세요.
public class SomeBean {
@Value("fooConfig.getStringArray('foo')")
private String[] fooArray;
}
이 방법이 효과가 있다고 생각합니다.p
바람직한 방법(특히 문자열의 경우)은 다음과 같습니다.
admin.user={'Doe, John','Headroom, Max','Mouse, Micky'}
및 사용
@Value("#{${admin.user}}")
private List<String> userList;
이 방법으로 파라미터에 콤마를 포함할 수도 있습니다.세트에도 사용할 수 있습니다.
속성 플레이스 홀더를 사용하는 경우 ser1702544의 예는 다음과 같습니다.
@Value("#{myConfigProperties['myproperty'].trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")
플레이스 홀더 xml 사용 시:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="myConfigProperties" />
<property name="placeholderPrefix"><value>$myConfigProperties{</value></property>
</bean>
<bean id="myConfigProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:myprops.properties</value>
</list>
</property>
</bean>
정답
@Value("#{'${my.list.of.strings}'.split(',')}")
private List<String> myList;
는 쉼표로 구분된 값에 대해 예상대로 작동합니다.null을 처리하기 위해(속성이 지정되지 않은 경우) 기본값을 추가했습니다.': '
다음과 같이 빈 문자열로 입력합니다.
@Value("#{'${my.list.of.strings: }'.split(',')}")
언급URL : https://stackoverflow.com/questions/12576156/reading-a-list-from-properties-file-and-load-with-spring-annotation-value
'source' 카테고리의 다른 글
현재 PHP 페이지 이름을 가져오는 방법 (0) | 2022.09.25 |
---|---|
React useEffect를 사용하여 로드 함수를 한 번만 호출하는 방법 (0) | 2022.09.25 |
JavaScript 개체에서 키를 제거하려면 어떻게 해야 합니까? (0) | 2022.09.25 |
Python의 디렉터리에 있는 여러 파일 이름 바꾸기 (0) | 2022.09.24 |
matplotlib를 사용하면 눈금 레이블의 글꼴 크기를 줄일 수 있습니다. (0) | 2022.09.24 |