我想用嵌入式Tomcat启动Spring Boot应用程序并在运行时创建数据库。
我编写了以下application.properties文件:
server.port=1111
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring-boot
spring.datasource.username=root
spring.datasource.password=
这是我的主要课程:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Configuration
@EnableAutoConfiguration
@ComponentScan("ma.mahmoud.springboot")
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
对于DAO,我使用Spring Data,因此我创建了以下界面:
public interface PlaceRepository extends CrudRepository<Place, Long> {
Place findByShortName(String shortName);
}
这是我为我的服务编写的界面:
public interface PlaceService {
Place getPlaceByShortName(String shortName);
}
这项服务的实施是这样的:
@Service
public class PlaceServiceImpl implements PlaceService {
@Autowired
private PlaceRepository placeRepository;
public Place getPlaceByShortName(String shortName) {
return placeRepository.findByShortName(shortName);
}
// GETTERS AND SETTERS
}
最初,我的应用程序在启动时抛出以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private ma.mahmoud.springboot.repository.PlaceRepository ma.mahmoud.springboot.service.impl.PlaceServiceImpl.placeRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [ma.mahmoud.springboot.repository.PlaceRepository] 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)}
修改
但是,在@SpringBootApplication
替换主要课程上的注释并将spring.jpa.database-platform
更正为org.hibernate.dialect.MySQL5Dialect
后,我收到以下错误:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.springframework.core.convert.support.DefaultConversionService.addCollectionConverters(Lorg/springframework/core/convert/converter/ConverterRegistry;)V from class org.springframework.boot.bind.RelaxedConversionService
我正在使用以下pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<properties>
<hibernate.version>5.0.3.Final</hibernate.version>
<spring.version>4.2.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
因为我使用注释,所以我没有为Spring使用任何XML配置。我忘记了什么吗?或者我需要另一个注释才能使其正常工作?
答案 0 :(得分:2)
代码看起来是正确的,但是,你的方言不是。您最初为MySQL数据库设置了PostgreSQLDialect
,但现在您将其替换为MYSQLDialect
,这不是有效的方言。
所以你应该使用:
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
或者如果您使用的是MySQL&lt; 5.x你应该使用:
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
在这两种情况下,MySQL中的“y”应该是小写。可以在Hibernate documentation中找到所有方言的完整列表。但是,在大多数情况下,方言不是强制性的,因此您也可以尝试删除spring.jpa.database-platform
属性。
要回答您编辑过的问题,Spring和Spring启动版本之间存在不一致。如果您没有任何理由更改Spring版本(甚至是Hibernate版本),您可能不应该这样做,您应该从 pom.xml 中删除以下行:
<hibernate.version>5.0.3.Final</hibernate.version>
<spring.version>4.2.2.RELEASE</spring.version>
答案 1 :(得分:2)
Spring Boot 1.4至少需要Spring 4.3,如https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes所述:
Spring Boot 1.4构建并需要Spring Framework 4.3。
因此,您可以降级到Spring Boot 1.3.x或使用Spring 4.3。
答案 2 :(得分:0)
尝试在@EnableJpaRepositories("package")
课程上添加Application
。
答案 3 :(得分:0)
您无需指定方言。我有一个类似的应用程序,以下是我的application.properties文件
spring.datasource.url = jdbc:mysql://localhost:3306/[db_name]
spring.datasource.username = root
spring.datasource.password =
spring.jpa.hibernate.ddl-auto=update[or "create-drop" if you want the tables created]
spring.jpa.show-sql=true
试试这个
答案 4 :(得分:-2)
1.将 @Component 注释中的任何一个添加到PlaceRepository的 Impelmentation 类中。
2.确定包裹PlaceRepository&amp;它的实现被添加到 @ComponentScan
中