Есть какой-нибудь способ динамически загружать @ImportResources, проверяя запущенный активный профиль?

#java #spring-boot

#java #весенняя загрузка

Вопрос:

У меня есть этот класс ниже… он отвечает за запуск моего приложения, есть ли какой-нибудь маневр, чтобы сделать аннотацию @ImportResources динамической?
Для моего тестового покрытия я хотел бы загрузить другой ресурс. Я пытаюсь избежать запуска модульного теста с моей параллельной конфигурацией, потому что результаты являются прерывистыми.

     import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    import org.apache.http.client.HttpClient;
    import org.apache.http.conn.ssl.NoopHostnameVerifier;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.ssl.SSLContextBuilder;
    import org.apache.http.ssl.TrustStrategy;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ImportResource;
    import org.springframework.http.client.BufferingClientHttpRequestFactory;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
    import org.springframework.web.client.RestTemplate;
    
    import br.com.bradesco.ciar.srv.agorainv.infrastructure.LoggingClientHttpRequestInterceptor;
    
    @SpringBootApplication
    @ImportResource("spring/*.xml")
    public class Application {
    
        @Value("${rest.timeout.read}")
        private int readTimeout;
        @Value("${rest.timeout.connect}")
        private int connectTimeout;
    
        public static void main(final String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @Bean
        public HttpClient httpClient() {
            try {
                return HttpClients.custom().setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                        .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                            @Override
                            public boolean isTrusted(final X509Certificate[] arg0, final String arg1) throws CertificateException {
                                return true;
                            }
                        }).build()).build();
            }
            catch (final Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        @Bean
        public HttpComponentsClientHttpRequestFactory httpRequestFactory() {
            final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient());
            requestFactory.setReadTimeout(readTimeout);
            requestFactory.setConnectTimeout(connectTimeout);
            return requestFactory;
        }
    
        @Bean
        public RestTemplate restTemplate() {
            final RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(httpRequestFactory()));
            restTemplate.getInterceptors().add(new LoggingClientHttpRequestInterceptor());
            return restTemplate;
        }
    
        @Bean
        public LocalValidatorFactoryBean restValidator() {
            return new LocalValidatorFactoryBean();
        }
    
    }

  

Ответ №1:

Вы могли бы попробовать переместить @ImportResource аннотацию в отдельный класс конфигурации, аннотированный аннотацией @Profile, например:

 @Profile("!Test")
@Configuration
@ImportResource("spring/*.xml")
class ResourceConfiguration {}
  

Комментарии:

1. Но я должен проверить, активен ли какой-либо профиль, и после этого я решаю, какой ресурс использовать. У меня есть другая папка с именем spring-test, которая содержит режим синхронизации, и я должен выполнить эту папку вместо spring / * xml.