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

本贴最后更新于 2570 天前,其中的信息可能已经东海扬尘

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 也能正常访问。

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1459 回帖 • 31 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    Spring Boot 本质就是 Spring 应用。
    so ,Spring Boot 也要遵守 Spring 容器初始化的规范。

    简言之, Spring Boot Appliacation 类是一个配置类,这个类是 Spring 应用的配置,采用自动扫描的机制。默认的,会扫描该类下面的所有的注解为 Spring bean 的类。 所以 ,这个类应处于应用的根目录~

  • someone

    ❤️ 非常感谢解答

  • crick77

    其实是因为按照首字母排序的原因。。。 哈哈

    1 回复
  • someone9891

    首字母培训,就算我把 App.java 改成了 Booter.java ,也是从第一排到第二啊 😬

  • someone

    我也遇到这样的问题,就是不知道原因。

  • someone

    你看下面老卫 的回复,就是这个原因。

请输入回帖内容 ...