programing

Spring-Boot 다중 모듈 프로젝트 로드 속성 파일

javamemo 2023. 7. 14. 23:23
반응형

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에 복사되지 않은 것을 발견했습니다.

작동하기 위해 다음을 만들었습니다.

  1. 리소스 폴더에서 고유 패키지를 만든 다음 application.properties 파일을 그 안에 저장했습니다. 예: com/company/project

  2. 구성 파일(예: 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

반응형