Spring Boot 2 MultiProject Build игнорирует application.yml из подпроекта - PullRequest
0 голосов
/ 17 мая 2019

Я работаю над сборкой нескольких проектов с использованием Spring Boot 2.1.5.RELEASE.

Я поделился примером на https://github.com/MBurchard/ACME

При выполнении тестовых случаев из подпроекта хранилища все конфигурации YAML изнутри проекта хранилища обнаруживаются и используются.

При запуске SpringBootApplication из веб-проекта с профилем dev выдается ошибка.

spring:
  # PROFILES
  profiles:
    active: ${profile:dev}

Причина ошибки

Caused by: java.lang.IllegalArgumentException: Not a managed type: class de.mbur.acme.User
at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:552) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:74) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]

Причина ясна. он не использует application.yml из проекта хранилища.

При переключении на dev-full-config все работает нормально

spring:
  # PROFILES
  profiles:
    active: ${profile:dev-full-config}

Но я не хочу повторять полную конфигурацию для базы данных, которая является более или менее внутренней.

Что я могу сделать, чтобы получить эту работу без повторения внутренней конфигурации базы данных?

1 Ответ

0 голосов
/ 19 мая 2019

Я решил эту проблему, написав расширенную конфигурацию хранилища, чтобы можно было находить и использовать файлы сопоставления Hibernate, а также учитывать внешнюю конфигурацию свойств во время тестирования или выполнения ...

Подробности можно найти по адресу: https://github.com/MBurchard/ACME/commit/499dbb128efb08614145754dc54e2ae8d4fc5d00

package de.mbur.acme.storage;

import java.util.Collections;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.sql.DataSource;

import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.slf4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import static org.slf4j.LoggerFactory.getLogger;

@Configuration
class MySQLConfig {
    private static final Map<String, String> HIBERNATE_MAPPINGS = Stream.of(new String[][]{
            {"hibernate.format_sql", "spring.jpa.properties.hibernate.format_sql"},
            {"hibernate.show_sql", "spring.jpa.show-sql"},
    }).collect(Collectors.collectingAndThen(
            Collectors.toMap(data -> data[0], data -> data[1]),
            Collections::<String, String>unmodifiableMap));
    private static final Logger LOG = getLogger(MySQLConfig.class);

    static {
        LOG.debug("Hier bin ich");
    }

    private final Environment env;

    MySQLConfig(final Environment env) {
        this.env = env;
    }

    private Properties additionalProperties() {
        final Properties properties = new Properties();
        HIBERNATE_MAPPINGS.entrySet().forEach(entry -> {
            final String property = env.getProperty(entry.getValue());
            if (property != null) {
                LOG.debug("{}: {}", entry.getValue(), property);
                properties.setProperty(entry.getKey(), property);
            }
        });
        return properties;
    }

    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactory(final DataSource dataSource,
            final JpaVendorAdapter jpaVendorAdapter) {
        final LocalContainerEntityManagerFactoryBean factoryBean =
                new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setMappingResources("hbm/user.xml");
        factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
        factoryBean.setJpaProperties(additionalProperties());
        return factoryBean;
    }

}

Как видно, и DataSource, и JpaVendorAdapter просто взяты из автоконфигурации Spring Boot.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...