2015-03-06 9 views
9

Ich versuche Spring JdbcTemplate Class zu verwenden, um eine Verbindung zu einer einfachen MySql-Datenbank basierend auf this Tutorial herzustellen. In der Tat, habe ich ihr Projekt Setup:Wie Spring JdbcTemplate verwenden, um eine Verbindung zu einer einfachen MySql-Datenbank herzustellen?

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>test</groupId> 
    <artifactId>jdbc-test</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

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

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <version>1.14.8</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Die Lombok Abhängigkeit für Getter und Setter ist.

Dann gibt es die Anwendungsklasse:

package test; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.jdbc.core.JdbcTemplate; 

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

    @Autowired 
    JdbcTemplate jdbcTemplate; 

    @Override 
    public void run(String... arg0) throws Exception { 
     System.out.println("Creating tables"); 
     jdbcTemplate.execute("drop table customers if exists"); 
     jdbcTemplate.execute("create table customers(" + 
       "id serial, first_name varchar(255), last_name varchar(255))"); 
    } 
} 

Und schließlich ein Kunde pojo:

package test; 

import lombok.AllArgsConstructor; 
import lombok.Data; 

@Data 
@AllArgsConstructor 
public class Customer { 
    private long id; 
    private String firstName, lastName; 
} 

Für Datenquelle Konfiguration, die ich in meine Ressourcen Ordner eine Datei application.properties haben:

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

spring.jpa.database = MYSQL 

spring.jpa.show-sql = true 

spring.jpa.hibernate.ddl-auto = update 
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy 

Die Datenbank läuft und es scheint immer noch nicht der Autowirig zu sein Arbeit. Hier ist die Ausnahme, die ich erhalte, wenn ich versuche, es zu laufen:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'application': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory. 
BeanCreationException: Could not autowire field: org.springframework.jdbc.core.JdbcTemplate test.Application.jdbcTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) 
     at test.Application.main(Application.java:12) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) 
     at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.jdbc.core.JdbcTemplate test.Application.jdbcTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire 
candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 
     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
     ... 21 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which 
qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
     ... 23 common frames omitted 

Was finde ich merkwürdig ist die Tatsache, dass, wenn ich den mysql-connector-java dependeny mit einem com.h2database ersetzen, es funktioniert einfach (wie im Frühjahr Beispiel).

Muss ich die mysql-Datenquelle auf eine andere Weise konfigurieren? Irgendwelche Vorschläge?

+1

Sie bitte sicher, automatisch konfiguriert werden, dass 'DataSourceAutoConfiguration' für Sie aktiviert ist. Fügen Sie '' debug '' java' Argument hinzu, wenn Sie Ihre Boot-Anwendung ausführen und einen Blick auf die Protokolle werfen. –

Antwort

19

die Abhängigkeit unten hinzufügen:

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

, die die Datenquelle

+0

Das hat funktioniert! Die Datenquelle ist konfiguriert. Ich habe jedoch einen weiteren Fehler gefunden: Die erste sql-Anweisung muss lauten: 'create table falls es noch keine Kunden gibt ', um in mysql zu arbeiten. Prost – lukas