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.
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})
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.
Peut-être avez-vous oublié le pilote MySQL JDBC.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.34</version>
</dependency>
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>
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.
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 = ***
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.
changer en dessous de la ligne de code
spring.datasource.driverClassName
à
spring.datasource.driver-class-name
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.
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.
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>
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
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....
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:
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
Cela a fonctionné pour moi, vous pouvez essayer votre: Ajoutez ceci aux options VM dans Tomcat
-DdevBaseDir="C:\Your_Project_Dir_Path"
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.
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:
exclude={datasource··}
.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.