Spring Boot - Nie można określić klasy sterownika wbudowanej bazy danych dla typu bazy danych BRAK


210

Oto błąd zgłaszany podczas próby uruchomienia mojej aplikacji internetowej:

[INFO] WARNING: Nested in 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.:
    [INFO] 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.
    [INFO]  at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.getDriverClassName(DataSourceProperties.java:91)
    [INFO]  at org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource(DataSourceAutoConfiguration.java:100)
    [INFO]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [INFO]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [INFO]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [INFO]  at java.lang.reflect.Method.invoke(Method.java:606)
    [INFO]  at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    [INFO]  at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
    [INFO]  at org.springframework.beans.factory.support.ConstructorResolver$3.run(ConstructorResolver.java:580)
    [INFO]  at java.security.AccessController.doPrivileged(Native Method)
    [INFO]  at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:577)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:989)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    [INFO]  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    [INFO]  at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
    [INFO]  at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
    [INFO]  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    [INFO]  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    [INFO]  at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    [INFO]  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    [INFO]  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    [INFO]  at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:370)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:989)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    [INFO]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    [INFO]  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    [INFO]  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    [INFO]  at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973)
    [INFO]  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:750)
    [INFO]  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    [INFO]  at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:683)
    [INFO]  at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
    [INFO]  at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:142)
    [INFO]  at org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener.initWebApplicationContext(SpringBootContextLoaderListener.java:60)
    [INFO]  at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    [INFO]  at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
    [INFO]  at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
    [INFO]  at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    [INFO]  at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    [INFO]  at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    [INFO]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    [INFO]  at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    [INFO]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    [INFO]  at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    [INFO]  at org.mortbay.jetty.Server.doStart(Server.java:224)
    [INFO]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    [INFO]  at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:249)
    [INFO]  at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:306)
    [INFO]  at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
    [INFO]  at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:79)
    [INFO]  at com.google.appengine.tools.development.Modules.startup(Modules.java:88)
    [INFO]  at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:254)
    [INFO]  at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
    [INFO]  at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:212)
    [INFO]  at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:210)
    [INFO]  at java.security.AccessController.doPrivileged(Native Method)
    [INFO]  at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:210)
    [INFO]  at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:277)
    [INFO]  at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
    [INFO]  at com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:219)
    [INFO]  at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:210)

Wierzę, że mam odpowiednią kombinację słoików datanucleus-appenginei datanucleus:

2.1: Wymaga DataNucleus 3.1.x (core, api-jdo, api-jpa, enhancer). Wymaga pakietu SDK 1.6.4+ Uwaga: ta wersja Datanucleus nie jest już obsługiwana przez projekt DataNucleus

Konfiguracja aplikacji JPA:

@Configuration
@EnableJpaRepositories("demo.core.entity")
@EnableTransactionManagement
class JpaApplicationConfig {
    private static final Logger logger = Logger
            .getLogger(JpaApplicationConfig.class.getName());
    @Bean
    public AbstractEntityManagerFactoryBean entityManagerFactory() {
        logger.info("Loading Entity Manager...");
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setPersistenceUnitName("transactions-optional");
        return factory;
    }
    @Bean
    public PlatformTransactionManager transactionManager() {
        logger.info("Loading Transaction Manager...");
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return txManager;
    }
    @Bean
    public PersistenceExceptionTranslator persistenceExceptionTranslator() {
        return new OpenJpaDialect();
    }
}

Application.java

@Configuration
@ComponentScan
@EnableAutoConfiguration
@RestController
public class Application {

    private static final EntityManagerFactory INSTANCE =
            Persistence.createEntityManagerFactory("transactions-optional");

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @RequestMapping("/")
    public String home() {
        return "Hello World";
    }

}

POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="...">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.demohq</groupId>
    <artifactId>demo-boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>demo-boot</name>
    <description>Demo project</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.0.BUILD-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-legacy</artifactId>
            <version>1.1.0.BUILD-SNAPSHOT</version>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>net.kindleit</groupId>-->
            <!--<artifactId>gae-runtime</artifactId>-->
            <!--<version>${gae.version}</version>-->
            <!--<type>pom</type>-->
            <!--<scope>provided</scope>-->
        <!--</dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.hsqldb</groupId>-->
            <!--<artifactId>hsqldb</artifactId>-->
            <!--<scope>runtime</scope>-->
        <!--</dependency>-->
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-labs</artifactId>
            <version>${gae.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-stubs</artifactId>
            <version>${gae.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-testing</artifactId>
            <version>${gae.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- DataNucleus -->
        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-api-jpa</artifactId>
            <version>${datanucleus.jpa.version}</version>
        </dependency>
        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-core</artifactId>
            <version>${datanucleus.jpa.version}</version>
        </dependency>
        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-enhancer</artifactId>
            <version>${datanucleus.jpa.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.appengine.orm</groupId>
            <artifactId>datanucleus-appengine</artifactId>
            <version>${datanucleus.version}</version>
            <!-- Need to exclude the enhancer since it interfere with the enhancer plugin. -->
            <exclusions>
                <exclusion>
                    <groupId>org.datanucleus</groupId>
                    <artifactId>datanucleus-enhancer</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.jdo</groupId>
            <artifactId>jdo-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jpa_2.0_spec</artifactId>
            <version>1.1</version>
        </dependency>

        <!-- OpenJPA -->
        <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa-persistence</artifactId>
            <version>2.3.0</version>
        </dependency>


    </dependencies>

    <properties>
        <start-class>demo.Application</start-class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.7</java.version>
        <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
        <datanucleus.jpa.version>3.1.1</datanucleus.jpa.version>
        <datanucleus.version>2.1.2</datanucleus.version>
        <gae.version>1.8.8</gae.version>
        <gae.home>${settings.localRepository}/com/google/appengine/appengine-java-sdk/${gae.version}/appengine-java-sdk/appengine-java-sdk-${gae.version}</gae.home>
        <gae.application.version>test</gae.application.version>
        <!--<org.springframework-version>4.0.5.RELEASE</org.springframework-version>-->
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--
            <plugin>
                <groupId>net.kindleit</groupId>
                <artifactId>maven-gae-plugin</artifactId>
                <version>0.9.6</version>
                <dependencies>
                    <dependency>
                        <groupId>net.kindleit</groupId>
                        <artifactId>gae-runtime</artifactId>
                        <version>${gae.version}</version>
                        <type>pom</type>
                    </dependency>
                </dependencies>
            </plugin>
            -->
            <plugin>
                <groupId>com.google.appengine</groupId>
                <artifactId>appengine-maven-plugin</artifactId>
                <version>${gae.version}</version>
                <configuration>
                    <enableJarClasses>false</enableJarClasses>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-release-plugin</artifactId>
                <configuration>
                    <goals>gae:deploy</goals>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat6-maven-plugin</artifactId>
                <version>2.0</version>
                <configuration>
                    <path>/</path>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.datanucleus</groupId>
                <artifactId>maven-datanucleus-plugin</artifactId>
                <version>${datanucleus.jpa.version}</version>
                <configuration>
                    <api>JPA</api>
                    <!--<mappingIncludes>**/entity/*.class</mappingIncludes>-->
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.datanucleus</groupId>
                        <artifactId>datanucleus-core</artifactId>
                        <version>${datanucleus.jpa.version}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <!-- We can configure our integration server to activate this profile and 
            perform gae:deploy, thus uploading latest snapshot to the http://1.latest.<applicationName>.appspot.com 
            automatically -->
        <profile>
            <id>integration-build</id>
            <properties>
                <gae.application.version>stage</gae.application.version>
            </properties>
        </profile>

        <!-- This profile will activate automatically during release and upload 
            application to the http://2.latest.<applicationName>.appspot.com (We might 
            want to set the 2nd version as our applications Default version to be accessible 
            at http://<applicationName>.appspot.com) -->
        <profile>
            <id>release-build</id>
            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>

            <properties>
                <!-- During release, set application version in appengine-web.xml to 
                    2 -->
                <gae.application.version>release</gae.application.version>
            </properties>
        </profile>
    </profiles>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>http://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>http://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

Zastanawiam się, czego brakuje w mojej aplikacji? Postępowałem zgodnie z instrukcją tutaj, używając Spring Data JPA w Google Appengine


Jeśli skomentuję @EnableAutoConfiguration otrzymuję: [INFO] OSTRZEŻENIE: nie powiodło się metricFilter: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nie zdefiniowano fasoli o nazwie „metricFilter”
kwarki

Oto pełny kod: bit.ly/1i53oAq
kwarki

W moim przypadku był to wiosenny start-start-data-jpa
Anand Rockzz,

Odpowiedzi:


170

Spring Boot nie dostarczył wystarczających informacji do automatycznej konfiguracji DataSource. Aby to zrobić, trzeba dodać kilka właściwości application.propertiesz spring.datasourceprefiksem. Spójrz na DataSourceProperties aby zobaczyć wszystkie właściwości, które możesz ustawić.

Musisz podać odpowiedni adres URL i nazwę klasy sterownika:

spring.datasource.url = 
spring.datasource.driver-class-name = 

3
Nie wiesz, co umieścić tutaj używam DataNucleus + Google App Engine
kwarki

@xybrek Wystarczy dodać plik application.properties do aplikacji i dodać w nim właściwości źródła danych.
iCrus

1
spring.datasource.url = jdbc: mysql: // localhost / abc # spring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.name = olabsenglishdb spring.datasource.username = xxxx spring.datasource.password = xxxx spring.datasource.driver-class-name = com.mysql.jdbc.Driver spring.jpa.database = mysql spring.jpa.database-platform = org.hibernate.dialect.MySQLDialect
swapyonubuntu

1
Zrobiłem to samo, kod działa poprawnie, gdy uruchamiam aplikację w intellij, ale kiedy tworzę jar i uruchamiam go przy użyciu java -jar myJar.jar, daje mi ten sam błąd.
Anas,

1
Cześć @ AndyWilkinson Stoję w obliczu tego samego błędu z kodem Cassandra Spring Boot. Tam próbuję połączyć się z Cassandrą. A w łączności Cassandra nie dajesz spring.datasource.url = … spring.datasource.driver-class-name = …właściwości. Dodałem więc @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})w mojej głównej klasie. Ale po umieszczeniu tego teraz pojawia się błąd Parameter 0 of constructor in org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration required a bean of type 'javax.sql.DataSource' that could not be found.. Proszę pomóż.
kumarhimanshu449

113

Jeśli chcesz korzystać z wbudowanej bazy danych H2 ze startera Spring Boot, dodaj poniższą zależność do pliku pom.

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.3.156</version>
    </dependency>

Ale jak wspomniano w komentarzach, wbudowana baza danych H2 przechowuje dane w pamięci i nie przechowuje ich na stałe.


2
Miałem ten sam problem z plikiem Spring-boot-starter-jdbc. Wypróbowałem tę sugestię i naprawiłem mój problem.
bluecollarcoder,

3
To nie jest prawdziwe rozwiązanie. O ile mi wiadomo, H2 nie będzie trwale zapisywać danych.
SARose

10
@ Sarose - Oczywiście, że nie! To baza danych „w pamięci”.
user672009,

1
@ user672009, niepoprawny. H2 to nie tylko baza danych w pamięci. Zobacz h2database.com/html/features.html . To powiedziawszy, jest to słabe rozwiązanie problemu.
Jason Nichols,

5
Próbuję zbudować czyjąś aplikację i pojawia się błąd „Nie można określić ... dla typu bazy danych BRAK”. Po wypróbowaniu innych rozwiązań próbuję tego i działa. Aplikacja została zaprojektowana do korzystania z dwóch baz danych skonfigurowanych według właściwości. Skonfigurowałem je, ale dostałem ten błąd. Po dodaniu zależności H2 nie ma już błędów. Aplikacja korzysta z innych określonych przeze mnie DB, nic nigdy nie trafia do H2, AFAICT. Może to być efekt uboczny sprężynowego rozruchu lub problem w projekcie tej aplikacji, ale wymaga H2, zanim się uruchomi. Ponieważ inni mają ten problem, nie może to być tylko ta aplikacja.
LS

87

Miałbym ten sam problem i wykluczenie DataSourceAutoConfiguration rozwiązało problem.

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class RecommendationEngineWithCassandraApplication {

    public static void main(String[] args) {
        SpringApplication.run(RecommendationEngineWithCassandraApplication.class, args);
    }
}

3
Dzięki! można go skonfigurować application.properties, na przykładspring.main.web-environment=false
zhuguowei

1
Znalazłem @EnableAutoConfigurationw klasie innej niż SpringBootApplication i musiałem tam również dodać wykluczenie. TBH, prawdopodobnie nie potrzebuję @EnableAutoConfigurationtego przede wszystkim: /
cs94njw,

63

To zadziałało dla mnie (1.3.0.M5):

import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.boot.autoconfigure.orm.jpa.*;

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {

Wyklucz obie klasy.

To nie działało

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

7
Ten jest przeznaczony dla osób, które nie rozumieją, dlaczego „tajemniczo” wymagają dostępu do bazy danych w swojej aplikacji, kiedy nie powinny (np. Gdy dostęp do bazy danych jest obsługiwany przez inną aplikację, a ta jest po prostu „klientem”).
cst1992

31

Możesz dodać

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration   

do twojego application.propertiespliku.


2
To powinna być zaakceptowana odpowiedź, jeśli nie potrzebujesz źródła danych jdbc.
Farrukh Najmi

Jest to szczególnie przydatne, gdy masz wiele profili, a jeden z nich znajduje się w pamięci.
Doe Johnson

Dla mnie, musiałem exluse HibernateJpaAutoConfiguration również w celu pracy: spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
AbdelRahmane

20

Teraz, gdy przyjrzę się bliżej, wydaje mi się, że problem DataSource to czerwony śledź. Uruchamia się automatyczna konfiguracja rozruchu Hibernacji i to właśnie powoduje, że wymagane jest źródło danych. Hibernacja działa na ścieżce klasy, ponieważ masz zależność, od spring-boot-starter-data-jpaktórej się włączahibernate-entitymanager .

Zaktualizuj swoją spring-boot-starter-data-jpazależność, aby wykluczyć Hibernację:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
        </exclusion>
    </exclusions>
</dependency>

1
Błąd wciąż ten sam :-(
kwarki

Czy na pewno prawidłowo zastosowałeś wykluczenie? Zależność mvn: drzewo pomoże ci sprawdzić. Po wyłączeniu problem DataSource zniknął dla mnie (teraz widzę „Typ demo.core.entity.Resource nie jest znanym typem zarządzanym”, ale to osobny problem)
Andy Wilkinson

Cześć Andy, czy to oznacza, że ​​przetestowałeś rzeczywisty projekt, który opublikowałem? wygląda obiecująco
kwarki

1
Tak, to był projekt, który opublikowałeś. Jedyną zmianą, którą wprowadziłem, było dodanie wyłączenia hibernacji, jak opisano powyżej.
Andy Wilkinson,

Fajnie, wygląda na to, że skompilowałeś gałąź master lub gałąź JPA?
kwarki

14

Z podręcznika wiosennego .

Spring Boot może automatycznie konfigurować osadzone bazy danych H2, HSQL i Derby. Nie musisz podawać żadnych adresów URL połączenia, po prostu uwzględnij zależność kompilacji od wbudowanej bazy danych, której chcesz użyć.

Na przykład typowe zależności POM to:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>

Dla mnie pomijanie zależności Spring-boot-starter-data-jpa i po prostu użycie zależności spring-boot-starter-jdbc działało jak urok, pod warunkiem, że h2 (lub hsqldb) były uwzględnione jako zależności.


9

Spring boot wyszuka właściwości danych w pliku application.properties.

Zdefiniuj go w pliku application.properties lub yml

application.properties

spring.datasource.url=xxx
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=xxx

Jeśli potrzebujesz własnej konfiguracji, możesz ustawić własny profil i używać wartości źródła danych podczas tworzenia komponentu bean.



5

Napotkałem ten wyjątek podczas tworzenia interfejsów API dla ElasticSearch przy użyciu Spring Data. Zrobiłem następujące i zadziałało.

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

3

Miałem dwie zależności z groupId z org.springframework.data, następnie usunąłem jpa i zachowałem tylko mongodb, i zadziałało!

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
</dependency>

2

Rozwiązuję problem, dodając @AutoConfigureTestDatabase (replace = Replace.NONE)

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class TestClienteRepository {

}

2

Otrzymałem komunikat o błędzie w tytule o.s.b.d.LoggingFailureAnalysisReporterwraz z komunikatem „APLIKACJA NIE POWIODŁA SIĘ DO STARTU”. Okazało się, że nie dodałem -Dspring.profiles.active=devdo mojej konfiguracji debugowania Eclipse, więc nie miałem aktywnego profilu.


1
Dokładnie mój problem. Dodanie flagi do argumentów VM konfiguracji debugowania ( Run -> Debug configurations... -> Maven build -> [build name] -> JRE -> VM arguments)
pokaż

2

Ja też stanąłem przed tym samym problemem.

Cannot determine embedded database driver class for database type NONE.

W moim przypadku usunięcie pliku jar z repozytorium odpowiadającego bazie danych rozwiązuje problem. W repozytorium znajdował się uszkodzony słoik, który był przyczyną problemu.


1

W moim przypadku umieściłem zależność maven dla org.jasig.cas w mojej pom, która wywołała zależność hibernacji i która spowodowała, że ​​Spring Boot szukał źródła danych do automatycznego skonfigurowania trwałości hibernacji. Rozwiązałem to, dodając zależność maven com.h2database, zgodnie z sugestią użytkownika 672009. Dzięki chłopaki!


1

Ponieważ jest to jeden z pierwszych tematów zwróconych w Google z powodu tego błędu, opublikuję to, co zrobiłem, na wypadek, gdyby ktoś napotkał ten sam problem. Nie chciałem wykluczać DataSourceAutoConfiguration użycia bazy danych pamięci.

W moim przypadku ustawiałem parametry, tak jak mówili inni autorzy, ale application.properties plik znajdował się w niewłaściwym folderze .. lol

Więc jeśli nic takiego nie działa, sprawdź, czy plik jest w środku src/main/resources! W moim przypadku było w środkusrc/main/resources/static


1

Odpowiedź jest bardzo prosta, SpringBoot wyszuka sterownik bazy danych Embeddable. Jeśli nie skonfigurowałeś żadnej konfiguracji w postaci XML lub adnotacji, zgłasza ten wyjątek. Wprowadź zmiany w adnotacji w ten sposób

@EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class)
wyklucza to DataSourceAutoConfiguration. A ukończenie Perfect Simple Coding byłoby skuteczne, jeśli poprawnie skonfigurowałeś swoją klasę.

    @Controller
    @EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class)
     public class SimpleController {
      @RequestMapping("/")
      @ResponseBody
       String home() {
        return "Hello World!";
       }public static void main(String[] args) throws Exception {
        SpringApplication.run(SimpleController.class, args);
       }
    }



1

Jeśli naprawdę potrzebujesz „spring-boot-starter-data-jpa” jako zależności projektu, a jednocześnie nie chcesz zezwalać aplikacji na dostęp do żadnej bazy danych, możesz po prostu wykluczyć klasy autokonfiguracji

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

1

Próbowałem wszystkich wyżej wymienionych rzeczy, ale nie mogłem rozwiązać problemu. Korzystam z SQLite, a mój plik SQLite znajdował się w katalogu zasobów.

a) Konfiguracja wykonana dla IDE

Muszę ręcznie dodać poniższe wiersze w pliku .classpath mojego projektu.

<classpathentry kind="src" path="resources"/>
<classpathentry kind="output" path="target/classes"/>

Następnie odświeżyłem i wyczyściłem projekt z MenuBar u góry. jak Projekt-> Wyczyść-> Nazwa mojego projektu.

Następnie uruchamiam projekt i problem został rozwiązany.

application.properties dla mojego projektu to

spring.datasource.url=jdbc:sqlite:resources/apiusers.sqlite
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.jpa.properties.hibernate.dialect=com.enigmabridge.hibernate.dialect.SQLiteDialect
spring.datasource.username=
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update

b) Konfiguracja wykonana, jeśli wdrożenie jar wygeneruje ten sam błąd

Musisz dodać następujące wiersze do pliku pom.xml

  <build>
        <resources>
        <resource>
            <directory>resources</directory>
            <targetPath>${project.build.outputDirectory}</targetPath>
            <includes>
                <include>application.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Może to komuś pomóc.


1

jeśli nie masz żadnej bazy danych w swojej aplikacji, po prostu wyłącz automatyczną konfigurację źródła danych, dodając poniższą adnotację.

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

1

To samo dotyczy @Anas. Mogę uruchomić go w Eclipse, ale kiedy używam „java -jar ...” uruchom go, to daje mi ten błąd. Następnie stwierdziłem, że moja ścieżka kompilacji Java jest niepoprawna, brakuje jej folderu „src / main / resources”, więc aplikacja nie może znaleźć pliku application.properties. Gdy dodałem folder „src / main / resources” do ścieżki kompilacji Java, zadziałało.

I musisz dodać „@PropertySource ({„ application.properties ”})” w swojej klasie aplikacji.

Zrzut ekranu-1

Zrzut ekranu-2


Dzięki! Próbowałem cztery godziny
Santiago Martí Olbrich

1

W ten sposób rozwiązałem ten problem.

W moim przypadku: musiałem skonfigurować źródło danych dla MySQL Server, który był serwerem zewnętrznym.

Jak wszyscy wiemy, Spring Boot ma możliwość automatycznej konfiguracji DataSource dla osadzonych baz danych.

W ten sposób zdałem sobie sprawę, że musiałem wyłączyć automatyczną konfigurację źródła danych, aby użyć mojej niestandardowej konfiguracji.

Jak wspomniano powyżej przez wielu, wyłączyłem automatyczną konfigurację źródła danych Spring Boot w application.properties

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Zdefiniowałem wszystkie właściwości konfiguracji hibernacji w osobnym pliku: hibernacja-mysql.properties

Następnie zakodowałem własną niestandardową konfigurację hibernacji w następujący sposób i to rozwiązało problem.

Mój sposób na skonfigurowanie żądanego źródła danych na podstawie właściwości w niestandardowym pliku właściwości i wypełnienie komponentu LocalSessionFactoryBean źródłem danych i inną konfiguracją hibernacji.

Hibernacja niestandardowa klasa konfiguracji: -
-------------------------------------------- -------------

Hibernacja Konfiguracja niestandardowa


1

Użyj tej zależności poniżej.

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

Nie potrzebowałem bazy danych i pojawiał się ten błąd. Dodałem to i to naprawiło.
markthegrea

1

W moim przypadku, używając IDEA, po usunięciu outkatalogu, wszystko wraca do normy. Po prostu nie wiem dlaczego, ale się udało.


1

Miałem podobny problem i wykluczenie DataSourceAutoConfiguration i HibernateJpaAutoConfiguration rozwiązało problem.

Dodałem te dwie linie do mojego pliku application.properties i zadziałało.

> spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
> spring.autoconfigure.exclude[1]=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

1

Opublikowano już wystarczającą liczbę odpowiedzi. Podaję jednak, jaki błąd popełniłem i jak go naprawiłem.

W moim przypadku spakowałem swój projekt jako pomzamiastjar

pom.xml:

...
 <packaging>pom</packaging>
...

Zmienić na:

...
 <packaging>jar</packaging>
...

Może to być pomocne dla kogoś z tym samym błędem.


0

Możesz pobrać plik derby-10.10.1.1.jar z repozytorium Maven i umieścić go w folderze WEB-INF / lib, np. Application / WEB-INF / lib / derby-10.10.1.1.jar. Twój osadzony AnnotationConfigEmbeddedWebApplicationContext przejmie sterownik bazy danych i twój serwer zacznie działać bez żadnych problemów :-)


0

Jeśli używasz Gradle, dołącz prawą słoik sterownika, jak poniżej:

compile("org.mongodb:mongo-java-driver:3.3.0")

Lub jeśli używasz Maven, a następnie zrób to w stylu Maven, powinno to rozwiązać Twój problem.


0

Do każdego, kto przyjdzie do tego wątku po godzinach uderzania głową o ścianę. Rozwiązałem ten błąd, zmieniając

create table `group`(
    id char(19) primary key
);

do

create table if not exists `group`(
    id char(19) primary key
);

w moim pliku schema.sql w katalogu zasobów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.