Spring Загрузка - ошибка при создании bean с именем 'dataSource', определенным в ресурсе пути класса

У меня есть Spring загрузочное веб-приложение. Он был ориентирован на подход RESTful. Вся конфигурация кажется на месте, но по какой-то причине MainController не справляется с запросом. Это приводит к ошибке 404. Как это исправить?

@Controller
public class MainController {

    @Autowired
    ParserService parserService;

    @RequestMapping(value="/", method= RequestMethod.GET)
    public @ResponseBody String displayStartPage(){
        return "{hello}";
    }
}

Применение

@Configuration
@ComponentScan(basePackages = "")
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer{
        public static void main(final String[] args) {
            SpringApplication.run(Application.class, args);
        }

        @Override
        protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
}

ParserController

@RestController
public class ParserController {

    @Autowired
    private ParserService parserService;

    @Autowired
    private RecordDao recordDao;

 private static final Logger LOG = Logger.getLogger(ParserController.class);

    @RequestMapping(value="/upload", method= RequestMethod.POST)
    public @ResponseBody String fileUploadPage(
   }
}

UPDATE

Похоже, что MySQL не может быть инициализирован Spring....

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Injection of autowired dependencies failed; 

nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource; 

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Instantiation of bean failed; 

nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; 

nested exception is 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.

UPDATE2

application.properties

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/logparser
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.database = MYSQL
spring.jpa.show-sql = true

# Hibernate
hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql: true
hibernate.hbm2ddl.auto: update
entitymanager.packagesToScan: /

UPDATE4

Кажется, что контроллеры Lite не отвечают, хотя @RequestMapping установлены. Почему это может быть?

PS. Это происходит, когда я запускаю жизненный цикл Maven test. При работе в режиме дегустации в IntelliJ ошибка не выводится.

UPDATE5

Также я использую этот DAO, как описано в учебнике....

public interface RecordDao extends CrudRepository<Record, Long> {
}

http://blog.netgloo.com/2014/10/27/using-mysql-in-spring-boot-via-spring-data-jpa-and-hibernate/

UPDATE6

Я изменил свои свойства приложения. И пробовал каждую комбинацию, но он отказывается работать.; (

Выход Maven:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running IntegrationTest
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.365 sec <<< FAILURE! - in IntegrationTest
saveParsedRecordsToDatabase(IntegrationTest)  Time elapsed: 2.01 sec  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:331)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:213)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:290)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:292)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:233)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:176)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; nested exception is 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.

Ответ 1

Похоже, что исходная проблема связана с автоконфигурированием.

Если вам не нужен источник данных, просто удалите его из процесса автоматической конфигурации:

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

Ответ 2

Из взглядов вещей вы не передали достаточно данных в Spring Boot для настройки источника данных

Создать/В существующем application.properties добавить следующие

spring.datasource.driverClassName=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=

убедитесь, что вы добавили значение для каждого из свойств.

Ответ 3

Возможно, вы забыли драйвер JDBC MySQL.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.34</version>
</dependency>

Ответ 4

Я получал ту же ошибку, выяснилось, что это связано с некоторыми недостатками, отсутствующими в моем pom.xml, как у Spring JPA, Hibernate, Mysql или, возможно, джексоном. Поэтому убедитесь, что в вашем pom.xml не найдены зависимости и проверьте их совместимость с версиями.

<!-- Jpa and hibernate -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.3.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

Ответ 5

Свойства hibernate.* бесполезны, они должны быть spring.jpa.* свойствами. Не говоря уже о том, что вы пытаетесь переопределить те, которые уже установлены с помощью свойств spring.jpa.*. (Для объяснения каждого свойства я настоятельно рекомендую прочитать справочное руководство Spring Boot .

spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql = true

# Hibernate
spring.jpa.hibernate.ddl-auto=update

Также пакеты для сканирования автоматически определяются на основе базового пакета вашего класса Application. Если вы хотите указать что-то еще, используйте аннотацию @EntityScan. Также указание самого пакета toplevel не очень разумно, поскольку он сканирует весь путь класса, который будет сильно влиять на производительность.

Ответ 6

изменить ниже строку кода

spring.datasource.driverClassName

к

spring.datasource.driver-class-name

Ответ 7

Если вы используете application.properties в загрузочном приложении spring, просто поставьте приведенную ниже строку в application.properties и она должна работать:
spring.datasource.url: jdbc: mysql://google/? cloudSqlInstance = & socketFactory = com.google.cloud.sql.mysql.SocketFactory & user = **** & password = ** **

Ответ 8

Эта проблема возникает, когда вы используете Test. Добавить зависимость

testCompile group: 'com.h2database', name: 'h2', version: '1.4.197' 

Добавьте ресурсы папки в тестовый источник, добавьте файл bootstrap.yml и укажите контент.

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:h2:mem:TEST
    driver-class-name: org.h2.Driver
    username: username
    password: password
    hikari:
      idle-timeout: 10000

это позволит настроить источник данных.

Ответ 9

В моем случае это происходило, потому что org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource - это поле с автоопределением без квалификатора, и я использую несколько источников данных с квалифицированными именами. Я решил эту проблему, используя @Primary произвольно на одной из моих конфигураций dataSource bean, например,

@Primary
@Bean(name="oneOfManyDataSources")
public DataSource dataSource() { ... }

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

В любом случае мое решение работало, потому что мой beans задает DataSource по квалификатору, а файл автоматической настройки JPA радует, поскольку он имеет один первичный DataSource. Я никоим образом не рекомендую это как "правильный" способ сделать что-то, но в моем случае он быстро решил проблему и не сдерживал поведение моего приложения каким-либо заметным образом. Будем надеяться, что в один прекрасный день обойдется реализация AbstractRoutingDataSource и рефакторинг всех beans, которым нужен определенный DataSource, а затем, возможно, это будет более аккуратное решение.

Ответ 10

Я столкнулся с этой проблемой даже после предоставления всех необходимых свойств источника данных в application.properties. Затем я понял, что класс конфигурации свойств не был отсканирован при загрузке Spring, потому что он был в другой иерархии пакетов по сравнению с моей загрузкой Spring Application.java и, следовательно, никаких свойств не было применено к объекту datasource. Я изменил имя пакета моего класса конфигурации свойств и начал работать.

Ответ 11

Убедитесь, что у вас есть зависимость базы данных во время выполнения группы при build.gradle

runtime group: 'com.h2database', name: 'h2', version: '1.4.194'

или изменить область от теста до времени выполнения, если вы используете Maven

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.194</version>
    <scope>runtime</scope>
</dependency>

Ответ 12

Не имеет прямого отношения к исходному вопросу, но это будет полезно для кого-то. Эта ошибка возникла у меня с простой структурой проекта. Один проект обрабатывал некоторые операции с базой данных с помощью весны jdbc (скажем, A), а другой вообще не выполнял никаких операций jdbc (скажем, B). Но все же эта ошибка появилась во время запуска службы B. Говорить, что источник данных должен быть правильно инициализирован.

Как я понял, я добавил эту зависимость к родительскому pom из двух модулей

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

Это вызвало весну для инициализации зависимостей jdbc для проекта B тоже. Итак, я переместил его, чтобы поэкспериментировать. Помню, все было в порядке.

Надеюсь, это поможет кому-то

Ответ 13

Вы используете приложение как банку? (java -jar xxxx.jar)

Если это так, у вас есть application.properties, хранящиеся в этой банке?

Если нет, попробуйте выяснить, почему:

  • Чтобы автоматически упаковываться в банку, файлы могут находиться в: src/main/resources/application.properties
  • Плагин maven в файле pom.xml также может быть настроен

Ответ 14

Это сработало для меня, вы можете попробовать: Добавьте это в параметры VM в Tomcat

-DdevBaseDir="C:\Your_Project_Dir_Path"

Ответ 15

В моем случае я просто проигнорировал следующее в файле application.properties:

# Спящий режим

# Spring.jpa.hibernate.ddl-авто = обновление

Меня устраивает....

Ответ 16

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

Это может быть вызвано некоторыми причинами:

  1. Нет источника данных, вам нужно будет создать свой источник данных, h2-источник данных в памяти или что-то еще, или вы можете выбрать способ, например exclude={datasource··}.
  2. У вас есть источник данных, например MySQL, но он все еще не работает. Он был вызван классом AutoConfigureTestDatabase, он выберет источник данных для вас, который может вызвать неоднозначность.

Решение: добавьте @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) чтобы избежать замены источника данных по умолчанию.

Ответ 17

Я столкнулся с одной и той же проблемой в течение нескольких дней, и, наконец, проблема не в коде, проблема связана с maven, вы должны удалить все файлы, которые он загрузил с вашего жесткого диска "C:\Users\username.m2\репозиторий "и выполните еще одно обновление maven для вашего проекта, которое поможет вам решить вашу проблему.

Ответ 18

Я решил проблему с изменением родительской зависимости Spring Boot.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
</parent>

в

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.6.RELEASE</version>
</parent>

Дополнительные сведения см. В примечаниях к выпуску: Spring Boot 2.1.0 Примечания к выпуску

Ответ 19

Если ничего из вышеперечисленного не работает для вас, есть вероятность, что вы не используете Java 8 или он не был правильно установлен в вашей системе (проверьте его, набрав в терминале java --version (для mac) или командная строка). Это было так для меня. Мне пришлось удалить Java и переустановить Java 8 (перейдите к правильному способу удаления Java на Mac, если вы являетесь пользователем Mac), и проблема была решена.