web-dev-qa-db-fra.com

Spring Boot - Erreur de création du bean avec le nom 'dataSource' défini dans la ressource de chemin de classe

J'ai une application Web Spring Boot. C'est centré sur l'approche RESTful. Toute la configuration semble en place, mais pour une raison quelconque, MainController ne parvient pas à gérer la demande. Il en résulte une erreur 404. Comment le réparer?

@Controller
public class MainController {

    @Autowired
    ParserService parserService;

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

Application

@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(
   }
}

METTRE À JOUR

On dirait que MySQL ne peut pas être initialisé par 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

Il semble que les contrôleurs légers ne répondent pas même si @RequestMapping est défini. Pourquoi cela pourrait-il être?

PS. Cela se produit lorsque je lance le cycle de vie de Maven test. Lors de l'exécution en mode degub dans IntelliJ, aucune erreur n'est générée.

UPDATE5

J'utilise aussi ce DAO comme expliqué dans le tutoriel ....

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

J'ai changé les propriétés de mon application. Et essayé chaque combinaison mais il refuse de travailler. ; (

Sortie 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.
45
J.Olufsen

On dirait que le problème initial est avec la configuration automatique.

Si vous n'avez pas besoin de la source de données, supprimez-la simplement du processus de configuration automatique:

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
75
Jason Warner

De la manière dont vous n'avez pas transmis suffisamment de données à Spring Boot pour configurer la source de données

Créez/dans votre application.properties existant ajoutez les éléments suivants

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

en vous assurant d'ajouter une valeur pour chacune des propriétés.

15
Alan Barrows

Peut-être avez-vous oublié le pilote MySQL JDBC.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.34</version>
</dependency>
10
gcgan

J'avais la même erreur, j'ai découvert que c'était dû à certaines des dépendances manquantes dans mon pom.xml, comme celles de Spring JPA, Hibernate, Mysql ou peut-être jackson . .xml et vérifiez leur compatibilité de version.

<!-- 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
Gaurav Anand

Les propriétés hibernate.* sont inutiles, elles devraient être des propriétés spring.jpa.*. Sans parler du fait que vous essayez de remplacer ceux déjà définis en utilisant les propriétés spring.jpa.*. (Pour l'explication de chaque propriété, je suggère fortement une lecture du Spring Boot guide de référence .

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

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

De plus, les packages à analyser sont automatiquement détectés en fonction du package de base de votre classe Application. Si vous voulez spécifier quelque chose d'autre, utilisez l'annotation @EntityScan. De plus, spécifier le paquet le plus toplevel n'est pas vraiment judicieux, car cela analysera tout le chemin de la classe, ce qui affectera gravement les performances.

4
M. Deinum

Si vous utilisez application.properties dans l'application de démarrage du printemps, insérez simplement la ligne ci-dessous dans application.properties et cela devrait fonctionner:
spring.datasource.url: jdbc: mysql: // google /? cloudSqlInstance = & socketFactory = com.google.cloud.sql.mysql.SocketFactory & user = ***

2
janakiram pulipati

Ce problème survient lorsque vous exécutez Test . Ajoutez une dépendance. 

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

Ajouter des ressources de dossier sous la source de test, ajouter le fichier bootstrap.yml Et fournir le contenu.

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

cela va configurer votre source de données.

2
Kumar Abhishek

changer en dessous de la ligne de code

spring.datasource.driverClassName

à

spring.datasource.driver-class-name
2
user6536363

Je faisais face à ce problème même après avoir fourni toutes les propriétés de source de données requises dans application.properties. Ensuite, j'ai réalisé que la classe de configuration des propriétés n'était pas analysée par Spring Boot, car sa hiérarchie de packages était différente de celle de mon application Spring.Java. Par conséquent, aucune propriété n'a été appliquée à un objet de source de données. J'ai changé le nom du paquet de la classe de configuration de mes propriétés et cela a commencé à fonctionner. 

1
Mahesh Japkar

Dans mon cas, cela se passait parce que org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource est un champ auto-câblé sans qualificateur et que j'utilise plusieurs sources de données avec des noms qualifiés. J'ai résolu ce problème en utilisant @ Primary de manière arbitraire sur l'une de mes configurations de beans dataSource,

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

Je suppose qu'ils veulent que vous implémentiez AbstractRoutingDataSource, et cette configuration automatique fonctionnera alors, car aucun qualificateur n'est nécessaire. Vous disposez simplement d'une source de données qui permet à vos beans de se convertir en la source de données appropriée en fonction des besoins. Dans ce cas, vous n'avez plus du tout besoin des annotations @Primary ou @Qualifier, car vous ne disposez que d'une seule source de données.

Dans tous les cas, ma solution a fonctionné parce que mes beans spécifient DataSource par qualificateur, et que le processus de configuration automatique JPA est satisfait, car il ne possède qu'un seul DataSource primaire. Je ne recommande en aucun cas cela comme la "bonne" façon de faire les choses, mais dans mon cas, cela a résolu le problème rapidement et n'a pas dissuadé le comportement de mon application de manière perceptible. Espérons qu'un jour, nous arriverons à mettre en œuvre AbstractRoutingDataSource et à refactoriser tous les beans nécessitant un DataSource spécifique. Ce sera peut-être une solution plus rationnelle.

1
AdrianVeidt

Vérifiez que vous avez une dépendance de base de données à runtime group à build.gradle

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

ou changez la portée de test en runtime si vous utilisez Maven

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

Pas directement lié à la question initiale mais cela sera utile pour quelqu'un. Cette erreur m'est arrivée avec une structure simple à deux projets. Un projet traitait des opérations de base de données avec spring jdbc (disons A) et l’autre n’avait aucune opération jdbc (disons B). Mais toujours cette erreur est apparue pendant que je démarrais le service B. Dire que la source de données devrait être initialisée correctement.

Comme je l'ai découvert, j'avais ajouté cette dépendance au pom parent des deux modules

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

Cela a également amené Spring à initialiser les dépendances jdbc pour le projet B. Alors, je l'ai déplacé pour projeter le pom de A, tout allait bien.

J'espère que cela aiderait quelqu'un

1
Isuru Ranaweera

Dans mon cas, j'ai simplement ignoré les éléments suivants dans le fichier application.properties:

# Hibernate

# spring.jpa.hibernate.ddl-auto = mise à jour

Ça marche pour moi....

0
ram kumar

Exécutez-vous l'application comme un pot? (Java -jar xxxx.jar)

Si tel est le cas, le fichier application.properties est-il stocké dans ce fichier jar?

Si non, essayez de comprendre pourquoi:

  • Pour être automatiquement empaquetés dans le jar, les fichiers peuvent être dans: src/main/resources/application.properties
  • Le plugin maven dans pom.xml peut également être configuré
0
Remy Mellet

J'ai résolu mon problème avec le changement de dépendance de démarrage du ressort parent.

<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>

Pour plus d'informations, consultez les notes de publication: Notes de version de Spring Boot 2.1.0

0
Guchelkaben

Cela a fonctionné pour moi, vous pouvez essayer votre: Ajoutez ceci aux options VM dans Tomcat

-DdevBaseDir="C:\Your_Project_Dir_Path"
0
kazim

Je faisais face au même problème depuis plusieurs jours et finalement, le problème ne concerne pas le code, le problème vient de maven, vous devez supprimer tous les fichiers qu'il a téléchargés de votre disque dur "C:\Users\username.m2\référentiel "et effectuez une autre mise à jour pour votre projet, cela résoudra votre problème.

0
El Morabet Kamal

Donnez-vous quelque chose de différent. Lorsque vous rencontrez ce type d'erreur, vous ne pouvez pas créer de source de données Bean dans un scénario de test.

Cela peut être causé par certaines raisons:

  1. Aucune source de données, vous devrez créer votre source de données, source de données h2 en mémoire ou autre, ou vous pouvez choisir la méthode telle que exclude={datasource··}.
  2. Vous avez votre source de données, comme MySQL, mais cela ne fonctionne toujours pas. Cela a été causé par la classe AutoConfigureTestDatabase. Il choisira pour vous une source de données susceptible de créer une ambiguïté.

Solution: ajoutez @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) pour éviter de remplacer la source de données par défaut.

0
tyrantqiao