Как получить текущий / активный профиль в Spring во время "maven install"? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь получить активный профиль из файла application.properties во время "maven install". Я пытался;

@Value("${spring.profiles.active}")
String activeProfiles;

однако он возвращает ноль.

Вот соответствующая часть из application.properties;

#PROFILE SETTINGS
spring.profiles.active=@spring.profiles.active@

Есть идеи?

РЕДАКТИРОВАТЬ:

Вот классы, с которыми у меня проблемы;

Класс, который я пытаюсь получить активный профиль;

public class JdoProperties {

    @Value("${spring.profiles.active}")
    String activeProfiles;


    public Properties getProperties() { 
        Properties properties = new Properties();
        try {
            if(activeProfiles.contains("test")) {
                properties.load(new ClassPathResource("application-test.properties").getInputStream());
            } else if(activeProfiles.contains("dev")) {
                properties.load(new ClassPathResource("application-dev.properties").getInputStream());
            } else if(activeProfiles.contains("prod")) {
                properties.load(new ClassPathResource("application-prod.properties").getInputStream());
            }
        } catch(FileNotFoundException e) {
            System.out.println("FileNotFound " + e);
        } catch(IOException e) {
            //TODO: Logger
            System.out.println("IOException " + e);
        }

        return properties;
    }
}

The класс Я пытаюсь использовать этот профиль

public final class PMF 
{
    private PMF() {}

    public static PersistenceManagerFactory getPersistenceManagerFactory() {
        JdoProperties jdo_properties = new JdoProperties();
        Properties properties = jdo_properties.getProperties();
        return JDOHelper.getPersistenceManagerFactory(properties);
    }
}

Класс, который использует класс PMF;

@Configuration
@Import({ShiroBeanConfiguration.class,
        ShiroAnnotationProcessorConfiguration.class,
        ShiroWebConfiguration.class,
        ShiroWebFilterConfiguration.class})
public class RealmConfig{
...
    @Bean
    @DependsOn("lifecycleBeanPostProcessor")
    public Realm realm() {
        DataSource dataSourceMySQL = 
                (DataSource) PMF.getPersistenceManagerFactory()
                .getConnectionFactory();
        JdbcRealm jdbcRealm = new JdbcRealm();

        jdbcRealm.setCredentialsMatcher(new PasswordMatcher());
        jdbcRealm.setAuthenticationQuery(AUTHENTICATION_QUERY);
        jdbcRealm.setUserRolesQuery(USER_ROLES_QUERY);
        jdbcRealm.setPermissionsQuery(PERMISSIONS_QUERY);
        jdbcRealm.setDataSource(dataSourceMySQL);
        return jdbcRealm;
    }
...
}

И ошибка, которую я получаю;

Caused by: java.lang.NullPointerException
    at com.oe.dr.dream.data.JdoProperties.getProperties(JdoProperties.java:28)
    at com.oe.dr.dream.data.PMF.getPersistenceManagerFactory(PMF.java:14)
    at com.oe.dr.dream.config.RealmConfig.realm(RealmConfig.java:94)

1 Ответ

0 голосов
/ 26 февраля 2020

Глядя на ваше «Править», (я надеюсь) решение вашей проблемы должно быть простым:

  1. В вашем RealmConfig определите Realm как:

    @Bean
    @DependsOn("lifecycleBeanPostProcessor") //? I am not sure about that
    public Realm realm(@Autowired datasource) { //! let spring "care for" the datasource
        // use above datasource, return "same as before"...
    }
    
  2. (Предполагая профили в [dev, test, prod]) Введите (в src/main/resources/) 3 файла:

    • application-dev.properties
    • application-test.properties
    • application-prod.properties

    Вы должны иметь их уже сейчас, Spring (!) «Подберет их» в соответствии с «активными профилями» , то есть почему JdoProperties дублирует код / ​​функциональность пружины.

  3. Убедитесь, что все релевантные spring.datasource.* свойства (и все соответствующие профилю свойства) находятся в соответствующем файле application-<profile>.properties , Общие свойства для всех сред / профилей можно установить в application.properties ..resp. application-default.properties (далее: «профиль по умолчанию для пружины»).
  4. Если вы хотите различное содержимое файла application.properties для разных профилей (spring / maven), следуйте «подходу фильтрации» (с или без "maven profile" .. разница в распространении аргумента: mvn install -Pdev против mvn install -Dspring.profiles.active=dev), если нет, рассмотрите возможность удаления свойства + заполнитель. Вы можете проверить фильтрацию путем проверки target/classes/ (!) application.properties. (*)
  5. Для испытаний с указанием maven-maven @ActiveProfiles("test") является сильным / имеет высокий приоритет ...
  6. (опционально) Удалить PMF и JdoProperties классы.
  7. ... то, что я еще мог забыть.

(*) Пожалуйста, имейте в виду, что application.properties является (только) верхом 15 ". свойство источника "(также для spring.profiles.active).

Эта статья о Baeldung предлагает хорошее введение / обзор / справочник по пружинным профилям, включая интеграцию с maven ( Глава 4.6 ).

...