问题 使用Spring Boot + Hibernate + MySql运行MVC应用程序


我是Spring环境的新手。我正在尝试使用SpringBoot和Hibernate作为ORM和MYSQL作为数据库来开发基本的MVC应用程序。我遇到了很多麻烦来设置依赖项和配置。目前,我对以下错误感到震惊,我无法弄清楚如何克服它。

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.

这是我在我的应用程序中的设置。它没有 服务层和jsp页面 避免杂乱

数据库:

MySql - 一个名为Users的数据库已经存在,它有一个名为Users的表,其中包含一个用户示例列表

User.java(型号)

@Entity
@Table(name = "Users")
public class User {

    @Id
    @GeneratedValue
    public String id;

    public String username;

    public String firstname;

    public String lastname;

    public String password;
}

UserRepository:

@Repository
@Table(name = "Users")
public interface UserRepository extends JpaRepository<User, String> {
}

UserController的:

@RestController
public class UserController {

    private UserRepository userRepository;

    @Autowired
    public UserController(UserRepository userRepository)
    {
        this.userRepository = userRepository;
    }

    @RequestMapping("user")
    public void getUser(@RequestParam("id") String id) {
         User user = userRepository.findOne(id);
    }

}  

Application.properties:

server.port:9000

spring.datasource.url:jdbc:mysql:// localhost / Users

spring.datasource.driverClassName:com.mysql.jdbc.Driver

spring.datasource.username:root

spring.datasource.password:

的pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.3.RELEASE</version>
</parent>

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- HIBERNATE -->

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.0.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.0.Final</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- Spring ORM, works with Hibernate -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
    </dependency>

    <!-- MYSQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

</dependencies>

编辑:添加主类

主类

@ComponentScan
@Configuration
@EnableAutoConfiguration
public class ApplicationStart {
    public static void main(String[] args)
    {
        SpringApplication.run(ApplicationStart.class, args);
    }
}

这是我的应用程序的当前设置。我似乎甚至不知道在哪里寻找错误,互联网上的教程对我的事业没有帮助。因此,非常感谢有关如何解决异常的任何帮助。

如果需要更多信息,请评论。

谢谢-


5825
2017-07-01 16:15


起源

显然它不会读你的 application.properties 文件。确保它位于类路径的根目录中(src/main/resources)或在你的jar旁边的文件系统上。通常,您使用属性文件分隔键/值对 = 代替 : 虽然后者应该奏效。我也没有真正得到你的设置只是删除hibernate的排除,只包括 hibernate-entitymanager 没有版本作为依赖。其他一切都将得到妥善处理。 - M. Deinum
@ M.Deinum:如果删除该排除项,我会收到以下异常 - java.lang.IllegalArgumentException: Not an managed type: class models.User 和我的 application.properties 在资源目录中。 - Balasubramanian
这更多表明您的设置存在其他问题。请添加您拥有的任何其他配置类/文件。 - M. Deinum
该 EnableAutoConfiguration 正试图找出哪些包根据它所在的包来扫描实体。你可能想要添加一个 @EntityScan 指向包含您的实体类的包。还要注意 ComponentScan 将从同一个包开始扫描 ApplicationStart class in。也许你可以在帖子中包含你的包结构。 - M. Deinum
问题在于ApplicationStart与控制器,存储库和模型不在同一个包中。在同一个包装中泡吧后,事情就开始起作用了。我也没有必要添加@EntityScan注释。谢谢你的帮助:)你能否在答案中添加你的最后评论 - 它可以帮助其他人轻松找到它:) - Balasubramanian


答案:


确保你的 application.properties 在其中一个 支持的地点

  1. 当前目录的A / config子目录。
  2. 当前目录
  3. 一个classpath / config包
  4. 类路径根

列表按优先级排序(列表中较高的位置覆盖较低的项目)。

虽然用属性文件分隔属性文件中的键/值对 : 应该工作我建议坚持使用更普遍 = 分隔器。

你的pom包含一些不必要的混乱,我建议你移动。你应该只需要依赖 mysql-connector-java 其他一切都很混乱(其他依赖项是通过你依赖的入门项目提供的)。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MYSQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

这些应该是您需要的一切,版本和传递依赖关系由spring-boot-dependency pom.xml处理。 (初级父母的祖父母)。

使用时 @EnableAutoConfiguration 注释具有注释的类也将用于确定 从哪个包 开始扫描。通常,您会将此注释放在入门类上。建议将此应用程序类放在顶级包中(即。 your.package.application.StarterClass)所有其他包应该是该包的子包。这样,将自动检测所有类。

如果不可能,您可能需要添加额外的 @ComponentScan 指定一个基本包来开始扫描和a @EntityScan 指定包含您的实体的包。


14
2017-07-01 17:55



1)我的application.properties位于资源目​​录下。 2)我应用了你给出的依赖配置,我似乎得到以下异常: java.lang.IllegalArgumentException: Not an managed type: class models.User - Balasubramanian
这基本上表明它已经进一步与依赖关系(它显然传递数据源配置)并尝试构建存储库。请将您的主要课程添加到原始帖子。 - M. Deinum
@ M.Denium:我也添加了Main Class。除了我发布的内容之外,我似乎没有在应用程序中设置任何其他配置。 - Balasubramanian
是明确的依赖 hibernate-entitymanager 需要?在 spring-boot-starter-data-jpa:1.1.8.RELEASE,我看到依赖 hibernate-entitymanager。 - Abdull
@Abdull如果你使用JPA的启动程序pom,那么你不需要hibernate-entitymanager的显式依赖项 - MattEdge


我也面临同样的问题,但原因非常不同,我在上述所有答案中都尝试了2小时的所有答案。但终于知道我的文件属性名称'Application.properties'是以大写'A'开头的。它应该是小'A'。所以请同时考虑这一点。


0
2017-09-13 14:35