Spring-Boot 다중 모듈 프로젝트 로드 속성 파일
저는 메이븐에 스프링 부트 애플리케이션을 멀티 모듈 프로젝트로 가지고 있습니다.구조는 다음과 같습니다.
Parent-Project
|--MainApplication
|--Module1
|--ModuleN
에서MainApplication
프로젝트가 있습니다.main()
주석이 달린 메서드 클래스@SpringBootApplication
등등.이 프로젝트에는 항상 그렇듯이 자동으로 로드되는 application.properties 파일이 있습니다.그래서 나는 그 값들에 접근할 수 있습니다.@Value
주석
@Value("${myapp.api-key}")
private String apiKey;
Module1 내에서 모듈 구성이 저장되는 속성 파일(module1.properties라고 함)도 사용하려고 합니다.이 파일은 모듈에서만 액세스하여 사용할 수 있습니다.하지만 장전이 안 돼요.로 해봤습니다.@Configuration
그리고.@PropertySource
하지만 운이 없습니다.
@Configuration
@PropertySource(value = "classpath:module1.properties")
public class ConfigClass {
Spring-Boot으로 속성 파일을 로드하고 값에 쉽게 액세스하려면 어떻게 해야 합니까?올바른 솔루션을 찾을 수 없습니다.
내 구성
@Configuration
@PropertySource(value = "classpath:tmdb.properties")
public class TMDbConfig {
@Value("${moviedb.tmdb.api-key}")
private String apiKey;
public String getApiKey() {
return apiKey;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
구성 호출
@Component
public class TMDbWarper {
@Autowired
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
public TMDbWarper(){
tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
}
Null 포인터를 받는 중입니다.워퍼를 자동 배선할 때 생성자에서 예외가 발생합니다.
필드 주입의 경우:
필드는 빈을 구성한 후 구성 메서드가 호출되기 전에 바로 주입됩니다.이러한 구성 필드는 공개 필드일 필요가 없습니다.전체 사용 방법은 자동 배선 주석을 참조하십시오.이 경우 아래와 같이 생성자 주입을 사용합니다.
@Component
public class TMDbWarper {
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
@Autowired
public TMDbWarper(final TMDbConfig tmdbConfig){
this.tmdbConfig = tmdbConfig;
tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
}
(또는)
사용하다@PostConstruct
다음과 같이 초기화합니다.
@Component
public class TMDbWarper {
@Autowired
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
@PostConstruct
public void init() {
// any initialisation method
tmdbConfig.getConfig();
}
자동 배선은 객체를 생성한 직후(반사를 통해 생성자를 호출한 후) 수행됩니다.그렇게NullPointerException
생성자에 다음과 같이 예상됩니다.tmdbConfig
생성자를 호출하는 동안 필드가 null이 됩니다.
아래와 같이 @PostConstruct 콜백 방법을 사용하여 이 문제를 해결할 수 있습니다.
@Component
public class TMDbWarper {
@Autowired
private TMDbConfig tmdbConfig;
private TmdbApi tmdbApi;
public TMDbWarper() {
}
@PostConstruct
public void init() {
tmdbApi = new TmdbApi(tmdbConfig.getApiKey());
}
public TmdbApi getTmdbApi() {
return this.tmdbApi;
}
}
나머지 구성이 올바른 것 같습니다.
이게 도움이 되길 바랍니다.
다음은 다른 모듈에서 속성을 얻을 수 있는 스프링 부트 다중 모듈의 예입니다.메인 애플리케이션 모듈, 데이터 구문 분석 모듈, 데이터 저장 모듈이 있다고 가정해 보겠습니다.
애플리케이션 모듈에서 App.java를 시작합니다.
@SpringBootApplication
public class StartApp {
public static void main(String[] args) {
SpringApplication.run(StartApp.class, args);
}
}
데이터 구문 분석 모듈의 구성입니다.ParseConfig.java:
@Configuration
public class ParseConfig {
@Bean
public XmlParseService xmlParseService() {
return new XmlParseService();
}
}
XmlParse 서비스입니다.java:
@Service
public class XmlParseService {...}
데이터 저장 모듈의 구성입니다.SaveConfig.java:
@Configuration
@EnableConfigurationProperties(ServiceProperties.class)
@Import(ParseConfig.class)//get beans from dataparse-module - in this case XmlParseService
public class SaveConfig {
@Bean
public SaveXmlService saveXmlService() {
return new SaveXmlService();
}
}
서비스 속성.java:
@ConfigurationProperties("datasave")
public class ServiceProperties {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
application.properties in data save-message in resource/config 폴더:
datasave.message=멀티 모듈 메이븐 프로젝트!
threads.xml.number=5
file.location.on.disk=D:\temp\registry
그런 다음 데이터 저장 모듈에서 @Value를 통해 모든 속성을 사용할 수 있습니다.
SaveXmlService.java:
@Service
public class SaveXmlService {
@Autowired
XmlParseService xmlParseService;
@Value("${file.location.on.disk: none}")
private String fileLocation;
@Value("${threads.xml.number: 3}")
private int numberOfXmlThreads;
...
}
또는 서비스 속성을 통해:
서비스.java:
@Component
public class Service {
@Autowired
ServiceProperties serviceProperties;
public String message() {
return serviceProperties.getMessage();
}
}
전에도 이런 상황이 있었는데, 속성 파일이 jar에 복사되지 않은 것을 발견했습니다.
작동하기 위해 다음을 만들었습니다.
리소스 폴더에서 고유 패키지를 만든 다음 application.properties 파일을 그 안에 저장했습니다. 예: com/company/project
구성 파일(예: TMDBConfig.java)에서 .properties 파일의 전체 경로를 참조했습니다.
@Configuration @PropertySource("classpath:/com/company/project/application.properties") public class AwsConfig
빌드하고 실행하면 마법처럼 작동할 것입니다.
자동 배선을 사용하여 속성을 읽을 수 있습니다.
@Configuration
@PropertySource(value = "classpath:tmdb.properties")
public class TMDbConfig {
@Autowired
private Environment env;
public String getApiKey() {
return env.getRequiredProperty("moviedb.tmdb.api-key");
}
}
이렇게 하면 다음을 호출할 때 컨텍스트에서 속성을 읽습니다.getApiKey()
@Value
식다음의해니다됩결해에이다로 됩니다.PropertySourcesPlaceholderConfigurer
.
언급URL : https://stackoverflow.com/questions/46784051/spring-boot-multi-module-project-load-property-file
'programing' 카테고리의 다른 글
변수가 정의되었는지 확인하시겠습니까? (0) | 2023.07.19 |
---|---|
몽구스에서 랜덤 레코드를 찾는 방법 (0) | 2023.07.14 |
예약된 Sql 키워드를 사용하여 명명된 테이블 열을 처리하는 방법 (0) | 2023.07.14 |
"self.x = x; self"를 피하려면 어떻게 해야 합니까?y = y; __init_의 self.z = z" 패턴? (0) | 2023.07.14 |
gitdiff를 사용하여 두 스프레드시트에서 읽을 수 있는 diff를 만들려면 어떻게 해야 합니까? (0) | 2023.07.14 |