@ConfigurationProperties 접두사가 작동하지 않습니다.
.yml 파일
cassandra:
keyspaceApp:junit
solr:
keyspaceApp:xyz
콩
@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {
@Value("${keyspaceApp:@null}") private String keyspaceApp;
메인 메서드 파일
@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
public class CommonDataApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(CommonDataApplication.class)
.web(false).headless(true).main(CommonDataApplication.class).run(args);
}
}
테스트 케이스
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CommonDataApplication.class)
@IntegrationTest
@EnableConfigurationProperties
public class CassandraClientTest {
@Autowired
CassandraClientNew cassandraClientNew;
@Test
public void test(){
cassandraClientNew.getSession();
System.out.println(" **** done ****");
}
}
junit을 keyspaceApp으로 설정하는 대신 xyz를 설정합니다.
접두사="cassandra"가 작동하지 않는 것 같습니다.
Spring Boot Typesafe Configuration Properties 기능을 사용하려고 하는 것 같습니다.
따라서 올바르게 동작하려면 코드에 몇 가지 변경을 추가해야 합니다.
우선, 당신의CommonDataApplication
학급은 가지고 있어야 한다.@EnableConfigurationProperties
주석(예:
@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
@EnableConfigurationProperties
public class CommonDataApplication {
public static void main(String[] args) {
// ...
}
}
난 네가 필요 없다고 생각해.@PropertySource("application.yml")
로서의 주석.application.yml
(또한application.properties
그리고.application.xml
)는 Spring Boot에서 사용되는 기본 설정 파일입니다.
당신의.CassandraClientNew
class는 필요 없습니다.@Value
주석 프리픽스keyspaceApp
소유물.그리고 당신의keyspaceApp
세터 방식이어야 합니다.
@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {
private String keyspaceApp;
public void setKeyspaceApp(final String keyspaceApp) {
this.keyspaceApp = keyspaceApp;
}
}
BTW, 를 사용하고 있는 경우List
또는Set
수집을 초기화합니다(예:List<String> values = new ArrayList<>();
필요한 것은 getter뿐입니다.컬렉션이 초기화되지 않은 경우 setter 메서드도 제공해야 합니다(그렇지 않으면 예외가 느려집니다).
그게 도움이 됐으면 좋겠어요.
일반답변수
1. 속성 파일 (application.properties 또는 application.yml)
# In application.yaml
a:
b:
c: some_string
2. 당신의 클래스를 선언합니다.
@Component
@ConfigurationProperties(prefix = "a", ignoreUnknownFiels = false)
public class MyClassA {
public MyClassB theB; // This name actually does not mean anything
// It can be anything
public void setTheB(MyClassB theB) {
this.theB = theB;
}
public static MyClassB {
public String theC;
public void setTheC(String theC) {
this.theC = theC;
}
}
}
3. 공공세팅업자를 선언하라!그리고 이것은 매우 중요합니다!
위의 클래스에서 이러한 공개 메서드를 선언해야 합니다.「public」수식자가 있는 것을 확인합니다.
// In MyClassA
public void setTheB(MyClassB theB) {
this.theB = theB;
}
// In MyClassB
public void setTheC(String theC) {
this.theC = theC;
}
바로 그겁니다.
최종 노트
- 당신 수업의 속성 이름은 스프링에게 아무 의미도 없어요.퍼블릭 세터만 사용합니다.나는 그들이 여기서 공공장소를 선언하지 않는다고 선언했다.속성에는 액세스 수식자가 있을 수 있습니다.
- "ignore" 속성에 유의하십시오.[ Unknown Fields ](알 수 없는 필드).기본값은 "true" 입니다."false"일 경우 파일 "application.yml"의 속성이 클래스 속성에 바인딩되지 않은 경우 예외가 발생합니다.디버깅 시 많은 도움이 됩니다.
"xyz"가 어디서 왔는지 알 수 없습니다(어플리케이션 전체를 보여주지 않을 수도 있습니다.yml?당신은 보통 그 일에 얽매이지 않는다.@Value
에@ConfigurationProperties
단, (프리픽스가 무엇인지 알 수 있는 방법은 없습니다).실제로 그랬습니까?@EnableCongigurationProperties
아무데나?사용하고 있습니까?SpringApplication
응용 프로그램 컨텍스트를 만들 수 있습니까?
Lombok의 퍼블릭세터나 @Setter를 추가하기만 하면 됩니다.
OP와 비슷하지만 다른 문제가 있어서 어디에서도 답을 찾을 수 없었기 때문에 투고하겠습니다.예를 들어 Lombok을 사용하여 설정 파일에 getters & setters 및 기타 필드를 자동으로 생성하려고 합니다.
다음은 예를 제시하겠습니다.
@Configuration
@ConfigurationProperties(prefix = "address")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AddressConfig {
private Endpoint endpoint;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class Endpoint {
private String url;
}
}
을 사용하는 @Getter
&@Setter
주석)@Data
보살피다@Getter
&@Setter
이 도 꼭 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.
@Accessors(fluent = false)
이유: 봄에는 설정을 실제로 입력하기 위한 setter 메서드가 필요합니다.단, 위의 예에서는 봄에 내부적으로 URL을 설정하는 방법을 보여 줍니다.
addressConfig.getEndpoint().setUrl("...")
;
프리픽스에는 getters 프리픽스가 을 알 수 .get
에는 "setters" 접두사 "setters" 가 .set
.
「 」가 @Accessors(fluent = false)
, , setters, get, get, get, setters, get, setters, get, setters, get, setters, get, setters, get, setters, get, setters, getters, getters, getters, , getters, getters, getters, get, , , get , , setters, s이로 인해 설정 pojo를 올바르게 입력하기 위한 스프링 기능이 상실됩니다.
응용 프로그램을 실행할 때 스프링이 이를 알려주지 않습니다.응용 프로그램에서 이러한 구성 변수를 사용하려고 시도할 때만 null 포인터 예외가 표시됩니다.난 이제서야 깨달았어@Accessors(fluent = false)
구글 수 를 몇 동안 한 후 에 대해 경고합니다.사이드 노트: 인텔리지는 다음과 같이 경고합니다.false
는 의 입니다.@Accessors
. -_-
어쨌든 여기에 주석이 있는 구성 클래스가 있습니다(예, 내부 클래스가 아닌 클래스 맨 위에 한 번만 추가하면 됩니다).
@Configuration
@ConfigurationProperties(prefix = "address")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AddressConfig {
private Endpoint endpoint;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(fluent = false)
@Builder
public static class Endpoint {
private String url;
}
}
이것이 이 케이스에 대한 풀 솔루션입니다.
내 클래스는 다음 속성을 받습니다.
// Setter are CRUCIAL for PropertySource + ConfigurationProperties works properly
@PropertySource(value = "classpath:application-dev.yml", ignoreResourceNotFound = true)
@ConfigurationProperties(prefix = "spring.data.mongodb")
@Setter
@Profile("dev")
@Configuration
@EnableReactiveMongoRepositories(
basePackages = {
"com.webflux.mongo2.project.repo",
"com.webflux.mongo2.task.repo"})
public class MyClassGettingTheProperties {
private String database;
private String host;
private String port;
private String username;
private String password;
private String authenticationDatabase;
}
내 속성 파일 - application-dev.yml:
spring:
data:
mongodb:
database: ${MONGO_INITDB_DATABASE}
host: ${HOST}
port: ${PORT}
username: ${MONGO_INITDB_ROOT_USERNAME}
password: ${MONGO_INITDB_ROOT_PASSWORD}
authentication-database: ${AUTH_MAN}
속성의 "원점"인 도커 컴포지트:
version: "3.4"
x-common-variables:
&env-vars
PORT_API: 1313
MONGO_INITDB_DATABASE: zzzzz
HOST: yyyyy
PORT: 27017
MONGO_INITDB_ROOT_USERNAME: xxxxx
MONGO_INITDB_ROOT_PASSWORD: xxxxxxx
AUTH_MAN: kkkkk
volumes:
api_vol:
networks:
mongo-cluster:
services:
api-db:
container_name: api-db
image: mongo:4.4.4
restart: always
ports:
- "27017:27017"
networks:
- mongo-cluster
volumes:
- api_vol:/data/db
environment:
*env-vars
언급URL : https://stackoverflow.com/questions/27416327/configurationproperties-prefix-not-working
'programing' 카테고리의 다른 글
ng폼 전체에 대한 변경과 같은 기능 (0) | 2023.03.02 |
---|---|
WordPress MediaWiki 통합 (0) | 2023.03.02 |
실시간 협업 편집 - 어떻게 작동합니까? (0) | 2023.03.02 |
TextField type="number"에 최소/최대값을 설정하시겠습니까? (0) | 2023.03.02 |
JavaScript 객체가 JSON인지 확인하는 방법 (0) | 2023.03.02 |