2015-01-20 9 views
30

Ich habe Spring Boot Web-Anwendung. Es konzentriert sich auf REST-Ansatz. Die gesamte Konfiguration scheint an ihrem Platz zu sein, aber aus irgendeinem Grund kann MainController die Anforderung nicht verarbeiten. Dies führt zu einem 404-Fehler. Wie man es repariert?Spring Boot - Fehler beim Erstellen Bean mit dem Namen 'dataSource' in Klassenpfad Ressource

@Controller 
public class MainController { 

    @Autowired 
    ParserService parserService; 

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

Anwendung

@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

Scheint, wie MySQL kann nicht von Frühling ....

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

Scheint lite-Controller reagiert nicht eventhoughinitialisiert werdensind eingestellt. Warum könnte es sein?

PS. Es tritt auf, wenn ich den Lebenszyklus von Maven test starte. Beim Ausführen im Degub-Modus in IntelliJ wird kein Fehler ausgegeben.

UPDATE5

Auch verwende ich diese DAO wie in Tutorial erklärt ....

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

Ich habe geändert Meine Anwendungseigenschaften. Und versuchte jede einzelne Kombination, aber es weigert sich zu arbeiten. (

Maven Ausgang;:

------------------------------------------------------- 
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. 
+0

Können Sie die databse Konfiguration hinzufügen? – Jens

+0

Sie mischen Yaml und Eigenschaften zusammen. 'hibernate.dialect: org.hibernate.dialect.MySQL5Dialect' wäre' hibernate.dialect = org.hibernate.dialect.MySQL5Dialect' –

+0

Geändert, wie Sie vorgeschlagen haben, aber Fehler bleibt –

Antwort

13

Von den Blicken von Dingen, die Sie nicht genügend Daten zum Frühjahr Boot-vergangen zu konfigurieren, dass die Datenquelle

erstellen/In Ihrem bestehenden application.properties fügen Sie den folgenden

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

Stellen Sie sicher, dass Sie einen Wert für jede der Eigenschaften anhängen.

+1

Ich habe bereits diese Datei und Config, obwohl es etwas anders 'spring.datasource.driver-class-name' anstelle von' spring.datasource.driverClassName' –

+0

und wenn Sie die Konfiguration für 'driver-class-name' in' driverClassName' ändern, funktioniert das oder ein anderer Fehler ? –

+1

gleicher Fehler perrsists –

4

Die hibernate.* Eigenschaften sind nutzlos, sie sollten spring.jpa.* Eigenschaften sein. Ganz zu schweigen davon, dass Sie versuchen, diejenigen zu überschreiben, die bereits mit den Eigenschaften spring.jpa.* festgelegt wurden. (Zur Erläuterung jeder Eigenschaft empfehle ich eine Lese des Frühlings-Boot-reference guide.

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

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

auch die Pakete scannen automatisch erkannt, basierend auf dem Basispaket Ihrer Application Klasse. Wenn Sie etwas anderes angeben möchten verwenden Sie die @EntityScan Anmerkung. auch die Top-Level-Paket zu spezifizieren nicht wirklich klug ist, wie es die ganze Klasse Pfad scannen, die stark die Leistung auswirken wird.

+0

Obwohl ich Eigenschaften änderte, wie Sie den gleichen Fehler vorgeschlagen. Controller funktioniert nicht ('404 error') sowie –

+0

Ihre Frage weicht von der ursprünglichen ab ... Dass ein Controller nicht gefunden werden kann, hat nichts mit einer Datenquelle zu tun. Ich würde vorschlagen, die Antwort zu markieren, die Ihr Datenquellenproblem gelöst hat, und ein neues für die Kontrolleure auszustellen. –

7

Vielleicht haben Sie den MySQL JDBC-Treiber vergessen.

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

Sieht aus wie das erste Problem mit der Auto-Config ist.

Wenn Sie nicht die Datenquelle benötigen, entfernen Sie einfach aus dem Auto-Config-Prozess:

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 
+9

hast du meinen Tag gerettet. (Nacht eigentlich ....) –

+0

danke, viel! :) – Laerte

0

Sind Sie die Anwendung als ein Glas läuft? (java -jar xxxx.jar)

Wenn ja, haben Sie die application.properties in diesem Jar gespeichert?

Falls nein, versuchen Sie herauszufinden, warum:

  • automatisch in dem Glas Paket zu sein, können die Dateien werden in: src/main/resources/application.properties
  • Die Maven-Plugin in der pom.xml kann auch
1

In meinem Fall so konfiguriert werden, geschieht, weil org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource ein autowired Feld ohne Qualifier ist, und ich bin mit mehreren Datenquellen mit qualifiziertem Namen. Ich löste dieses Problem durch die Verwendung @Primary willkürlich auf einer meiner Datasource-Bean-Konfigurationen wie so

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

Ich nehme an, sie wollen Sie AbstractRoutingDataSource implementieren, und dann, dass die automatische Konfiguration wird nur funktionieren, weil kein Qualifier benötigt wird, einfach Verfügen über eine einzelne Datenquelle, die es Ihren Beans ermöglicht, bei Bedarf zur entsprechenden DataSource aufzulösen. Dann brauchen Sie die @Primary- oder @Qualifier-Annotationen überhaupt nicht, weil Sie nur eine einzige DataSource haben.

In jedem Fall funktionierte meine Lösung, weil meine Beans DataSource nach Qualifier angeben, und die JPA-Auto-Konfiguration ist glücklich, weil es eine einzige primäre DataSource hat. Ich empfehle dies keineswegs als die "richtige" Art und Weise, Dinge zu tun, aber in meinem Fall löste es das Problem schnell und hielt das Verhalten meiner Anwendung in keiner merklichen Weise davon ab. Wird hoffentlich eines Tages dazu kommen, die AbstractRoutingDataSource zu implementieren und alle Beans zu refactorisieren, die eine bestimmte DataSource benötigen, und dann wird das vielleicht eine bessere Lösung sein.

4

Ich bekam den gleichen Fehler, fand heraus, dass es wegen einiger der Abhängigkeiten fehlte, die in meinem pom.xml wie das von Frühling JPA, Hibernate, Mysql oder vielleicht Jackson sind. Stellen Sie also sicher, dass Abhängigkeiten in Ihrer pom.xml nicht fehlen und überprüfen Sie ihre Versionskompatibilität.

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

Es funktionierte für mich können Sie versuchen: dies in Tomcat VM Optionen hinzufügen

-DdevBaseDir="C:\Your_Project_Dir_Path" 
1

Änderung unter Codezeile

spring.datasource.driverClassName 

zu

spring.datasource.driver-class-name 
1

Ich war vor diesem Problem Vorabend n nach dem Bereitstellen aller erforderlichen Datenquelleneigenschaften in application.properties. Dann stellte ich fest, dass die Eigenschaftenkonfigurationsklasse nicht vom Spring-Start durchsucht wurde, weil sie sich in einer anderen Pakethierarchie befand als meine Spring-Startanwendung.java, und daher wurden keine Eigenschaften auf das Datenquellenobjekt angewendet. Ich habe den Paketnamen meiner Eigenschaftskonfigurationsklasse geändert und sie hat begonnen zu arbeiten.

1

Wenn Sie application.properties im Frühjahr Boot-App verwenden, dann setzen Sie einfach das unten stehende Zeile in application.properties und es sollte funktionieren:
spring.datasource.url: jdbc: mysql: // google /? cloudSqlInstance = & socket = com.google.cloud.sql.mysql.SocketFactory & user = **** & Passwort = ****

0

in meinem Fall habe ich folgend in application.properties Datei einfach ignoriert:

# Hibernate

aktualisieren 0

# spring.jpa.hibernate.ddl-auto =

Es funktioniert für mich ....

Verwandte Themen