我有Spring Boot Web应用程序。它以RESTful方法为中心。所有配置似乎都存在但由于某种原因MainController无法处理请求。它导致404错误。如何解决?
@Controller
public class MainController {
@Autowired
ParserService parserService;
@RequestMapping(value="/", method= RequestMethod.GET)
public @ResponseBody String displayStartPage(){
return "{hello}";
}
}
应用
@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(
}
}
更新
似乎MySQL无法初始化......
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
似乎设置@RequestMapping
时,lite控制器没有响应。为什么会这样?
PS。它发生在我运行Maven的生命周期
test
时。 在IntelliJ中以degub模式运行时,不会输出错误。
UPDATE5
我也按教程中的说明使用这个DAO。
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
我确实更改了我的应用程序属性。并尝试了每一个组合,但它拒绝工作。 ;(
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.
答案 0 :(得分:81)
看起来最初的问题是自动配置。
如果您不需要数据源,只需将其从自动配置过程中删除:
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
答案 1 :(得分:15)
从你没有将足够的数据传递到Spring Boot来配置数据源
在您现有的application.properties
中创建/添加以下内容
spring.datasource.driverClassName=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
确保为每个属性附加一个值。
答案 2 :(得分:10)
也许你忘记了MySQL JDBC驱动程序。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
答案 3 :(得分:5)
我得到了同样的错误,发现它是由于我的pom.xml中缺少的某些依赖项,如Spring JPA,Hibernate,Mysql或者jackson。 因此,请确保pom.xml中没有缺少依赖项,并检查它们的版本兼容性。
<!-- 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>
答案 4 :(得分:4)
hibernate.*
属性没用,它们应该是spring.jpa.*
属性。更不用说您尝试使用spring.jpa.*
属性覆盖已设置的那些。 (对于每个属性的解释,我强烈建议阅读Spring Boot reference guide。
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql = true
# Hibernate
spring.jpa.hibernate.ddl-auto=update
还会根据Application
类的基础包自动检测要扫描的包。如果要指定其他内容,请使用@EntityScan
注释。同时指定最顶级的包并不是非常明智的,因为它将扫描整个类路径,这将严重影响性能。
答案 5 :(得分:3)
更改以下代码行
spring.datasource.driverClassName
到
spring.datasource.driver-class-name
答案 6 :(得分:2)
如果您在spring boot app中使用application.properties,那么只需将以下行放入application.properties即可以使用:
spring.datasource.url:jdbc:mysql:// google /?cloudSqlInstance =&amp; socketFactory = com.google.cloud.sql.mysql.SocketFactory&amp; user = ****&amp; password = ****
答案 7 :(得分:2)
运行Test时会出现此问题。 添加依赖
testCompile group: 'com.h2database', name: 'h2', version: '1.4.197'
在测试源添加文件bootstrap.yml下添加文件夹资源 并提供内容。
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
这将设置您的数据源。
答案 8 :(得分:1)
即使在application.properties中提供了所有必需的数据源属性之后,我也遇到了这个问题。然后我意识到属性配置类没有被Spring引导扫描,因为它与我的Spring引导Application.java相比处于不同的包层次结构中,因此没有属性应用于数据源对象。 我更改了属性配置类的包名称,它开始工作。
答案 9 :(得分:1)
在我的情况下,这种情况正在发生,因为org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource是一个没有限定符的自动装配字段,我使用的是具有限定名称的多个数据源。我在我的一个dataSource bean配置上任意使用@Primary解决了这个问题,如此
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)]) {
[[AVAudioSession sharedInstance] requestRecordPermission];
// Now run your function
}
我认为他们希望您实现AbstractRoutingDataSource,然后该自动配置将起作用,因为不需要限定符,您只需要一个数据源,允许您的bean根据需要解析为适当的DataSource。那么你根本不需要@Primary或@Qualifier注释,因为你只有一个DataSource。
在任何情况下,我的解决方案都有效,因为我的bean通过限定符指定DataSource,而JPA自动配置的东西很高兴,因为它有一个主要的DataSource。我绝不推荐这是做事的“正确”方式,但在我的情况下,它很快就解决了问题,并没有以任何明显的方式阻止我的应用程序的行为。希望有一天能够实现AbstractRoutingDataSource并重构所有需要特定DataSource的bean,然后这将是一个更简洁的解决方案。
答案 10 :(得分:1)
检查build.gradle
上运行时组是否具有数据库相关性runtime group: 'com.h2database', name: 'h2', version: '1.4.194'
如果使用Maven
,则将范围从测试更改为运行时<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.194</version>
<scope>runtime</scope>
</dependency>
答案 11 :(得分:1)
与原始问题没有直接关系,但这对某人有用。使用简单的两个项目结构,我发生了这个错误。一个项目是使用spring jdbc处理一些数据库操作(比如A)而另一个项目根本没有任何jdbc操作(比如B)。但是当我开始服务B时仍然出现这个错误。说数据源应该正确初始化。
正如我所知,我已将此依赖项添加到两个模块的父pom中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
这导致spring初始化项目B的jdbc依赖项。所以,我把它移到了A的pom,一切都很好。
希望这可以帮助某人
答案 12 :(得分:0)
它对我有用,你可以试试你的: 将其添加到Tomcat中的VM选项
-DdevBaseDir="C:\Your_Project_Dir_Path"
答案 13 :(得分:0)
就我而言,我在application.properties文件中忽略了以下内容:
#Hibernate
#spring.jpa.hibernate.ddl-自动=更新
它对我有用....
答案 14 :(得分:0)
给你一些不同的东西,当你遇到这种错误时,无法创造 测试用例中的bean数据源。
可能是由于某些原因引起的:
exclude={datasource··}
这样的方式。AutoConfigureTestDatabase
引起的,它将为您选择一个可能导致歧义的数据源。解决方案:添加@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
以避免替换默认数据源。
答案 15 :(得分:0)
您是否将该应用程序作为jar运行? (java -jar xxxx.jar)
如果是这样,你有没有存储在那个jar中的application.properties?
如果不是,请尝试找出原因:
答案 16 :(得分:0)
几天来我都遇到了同样的问题,最后问题不是代码,问题从maven传来,您必须删除他从硬盘驱动器“ C:\ Users \ username”下载的所有文件.m2 \ repository”,然后为您的项目进行另一个更新,这将解决您的问题。
答案 17 :(得分:0)
我通过更改父级Spring Boot依赖关系解决了我的问题。
import matplolib.pyplot as plt
for i in range(4):
plt.subplot(2,2,i+1).set_title('Subplot n°{}' .format(i+1))
plt.show()
到
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
有关更多信息,请查看发行说明:Spring Boot 2.1.0 Release Notes
答案 18 :(得分:0)
在MySQL中创建数据库
create database springboot2;
application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/springboot2
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
server.port=9192
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
主班
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
模型类
package com.First.Try.springboot.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name="PRODUCT_TBL1")
public class Product {
@Id
@GeneratedValue
private int id;
private String name;
private int quantity;
private double price;
....
....
....
}
答案 19 :(得分:0)
默认情况下,使用最新版本的 Spring Boot,data.sql 的加载是在创建表之前完成的。所以使用 - spring.jpa.defer-datasource-initialization=true
示例 -
**In application.properties :- **
spring.jpa.show-sql=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true
谢谢 阿塔尔·卡里姆