Подтвердить что ты не робот

Spring Boot - EnableAutoConfiguration с Исключением не работает

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

@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class ApiApplicationConfig { }

но когда я запускаю приложение, я получаю следующую стек:

Caused by: org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.getDriverClassName(DataSourceProperties.java:137)
at org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource(DataSourceAutoConfiguration.java:116)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
... 31 more

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

4b9b3361

Ответ 1

Это кажется странной ситуацией, когда DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition находит загрузчик класса DataSource, но не DataSource. У нас была проблема с spring -boot 1.2.2 при выполнении теста интеграции.

В любом случае, мы запустили gradle dependencies, чтобы узнать, что вытаскивали в tomcat-jdbc, и заменили нашу зависимость spring -boot-jdbc на простой spring -jdbc. Если в ваших зависимостях нет tomcat-jdbc, это может помочь установить точку останова в DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition.getDataSourceClassLoader(), чтобы узнать, какой драйвер он находит.

Ответ 2

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

BTW, spring boot по умолчанию использует эти свойства из application.properties для создания источника данных bean:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Посмотрите этот раздел spring Загрузочные документы для более подробной информации об автоматической настройке источника данных

Ответ 3

Единственное, что помогло моей проблеме исключения, заключалось в том, чтобы исключить зависимость tomcat jdbc от конфигурации spring:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Ответ 4

У меня возникла проблема при использовании @Configuration, @EnableAutoConfiguration и @ComponentScan при попытке исключить определенные классы конфигурации. Дело в том, не работает!

В конце концов я решил проблему, используя @SpringBootApplication, который согласно документации Spring делает то же самое функциональность как три выше в одной аннотации.

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}

Ответ 5

@Configuration

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

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

Ответ 6

Я попытался исключить tomcat-jdbc как sugegsted, а также список классов, исключенных в комментарии выше. Но никто не работал

at com.pb.gcs.payment.adjustment.file.receive.PaymentAdjustmentFileReceiveJobTask.main(PaymentAdjustmentFileReceiveJobTask.java:16), вызванный: org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT в значения BATCH_JOB_INSTANCE (JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) (?,?,?,?)]; Дублирующая запись '0' для ключа 'PRIMARY'; Вложенное исключение - java.sql.SQLIntegrityConstraintViolationException: дублирующаяся запись '0' для ключа 'PRIMARY' в org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExava.trans_traf.service.ransf_set.dll) (AbstractFallbackSQLExceptionTranslator.java:72) в org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1444) в org.springframe Блок-цитата Все еще получает исключение. Пожалуйста, помогите, я новичок в пакетной и весенней загрузки.

Ответ 7

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

<dependency>
     <groupId>com.h2database</groupId>
     <artifactId>h2</artifactId>
     <scope>test</scope>
</dependency>

Эта же проблема возникает при использовании @DataJpaTest для тестирования.