记录精彩的程序人生

笔记——springboot 的启动类必须要放在其他包的外层。

springboot 启动时遇到的问题

  • 1. 项目配置文件完全没有错,但是启动的时候 jpa 不自动建表
  • 2. 启动没有任何问题,controller 编写再三确认,但是启动以后 controller 无法访问。
  • 3. 肯定还有其他的问题,但是我还没有发现。

原因

以上问题的罪魁祸首,就是我自己手贱,把 springboot 的启动 类,自己建了个包放进去了。
原因嘛,就是因为我觉得其他的类都放在包里面,就这一个没有单独的包…… 而且为了代码结构看起来整洁,所以,脑抽建了个包,如下图:
cc12c9348c6a4133a5c2a0eb2814b248-image.png

就是这样啦,建了个 boot 包,然后把那个 app 改名 booter.java (自作聪明 == 自讨苦吃),看起来就是不一样了是吧。

然后问题就来了,首先,我创建了实体类,并且加了注解:
类似下面这样,写了几个实体类。

我的实体类

package com.hpwenxue.domain;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Roles {
	@Id
	@GeneratedValue
	private Integer id;
	private String name;
	private Date createTime;
	private Date updateTime;
	
	
	
	@Override
	public String toString() {
		return "Roles [id=" + id + ", name=" + name + ", createTime=" + createTime + ", updateTime=" + updateTime + "]";
	}
	public Roles(){
		
	}

	public Integer getId() {
		return id;
	}
	
	public void setId(Integer id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public Date getCreateTime() {
		return createTime;
	}
	
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	
	public Date getUpdateTime() {
		return updateTime;
	}
	
	public void setUpdateTime(Date updateTime) {
		this.updateTime = updateTime;
	}
	
	
}

然后,我配置了 jpa, 像下面这样:

我的配置文件

server:
  port: 8088
spring: 
  datasource: 
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/hp_wenxue
    username: root
    password: root
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: create
  thymeleaf:
    encoding: UTF-8
    cache: false
#    mode: HTML5
#    prefix: classpath:/templates/
#    suffix: .html
       



# 首次启动项目可以将ddl-auto 改为 create ,将会自动创建表结构
# 数据库需要手动创建好

OK, 启动项目。。。奇怪了,数据库没有变化,没有自动建表。。。再三确认配置文件和注解,都是没有问题的,于是,尝试改了依赖的版本,改了配置文件,都是没有成功的。

我就奇了怪了,这个东西我之前是有做过的,但是都是没问题的,现在怎么会有这种问题呢?

由于要出去吃饭了,所以我就想既然项目能启动起来,就先试试controller 能不能跑通吧?试了一下,依然是跑不通的。

我到底经历了什么鬼?

经过几百种尝试已经百度之后,我就重新建了一个项目,简单的配置后编写一个实体类,一执行:数 - 据 - 库 - 有 - 表 - 了.....,然后写了个controller ,一请求,又 - 成 - 功 - 了.....。……

我把新建的项目和我原本的项目进行仔细的对比————最大的不同,就是我自己给 springboot 的启动类App.java 建了个包,还和controllerdomain 包是同级的,于是我把这个App.java 放回人家原本的位置。启动项目。OK ,什么问题都没有了。

我。。。我 不服

我想可能是 springboot 在启动的时候,就已经去读 controller 和 实体类了,或者对这两个东西做了什么操作了。但是由于包的原因,他没有找到这两个,所以被忽略了。当然,我也只是瞎猜,其中缘由我目前还是不知道的,如有大神知晓,烦请告知,不甚感激

  • 为了证明我的猜想,我又做了如下验证:

1. 把App.java 放在controller 的根目录
2. 把App.java 放在entity 的根目录
3. 把App.java 放在所有包的最外层目录

结论如下:

1.controller 能访问,数据库不能自动建表。
2. 数据库能自动建表,但是controller 不能访问。
3. 数据库能自动建表,controller 也能正常访问。

一个可菜可菜的码农

留下你的脚步