springboot应用程序

时间:2017-01-17 14:15:50

标签: spring maven spring-boot

我想用嵌入式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配置。我忘记了什么吗?或者我需要另一个注释才能使其正常工作?

5 个答案:

答案 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