写在前面:这个问题并不是我最初遇到的问题,是自己误打误撞遇到的
springboot入门案例
最初的问题:访问controller出现404
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liuzeyu12a</groupId>
<artifactId>spring01_quick</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!--web过程的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
- controller
@Controller
public class QuickController {
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "hello springboot";
}
}
经查阅资料发现,这是由于springBoot默认包扫描机制没有扫描到controlle里面的的这个类,因此返回的时候没有找到路径爆出404。
springBoot默认包扫描机制:默认扫描启动类所在的包同级文件和子包下的文件,因此放在start下是无法扫描到controller下的。
解决方案
将启动类放在liuzeyu包下即可。
或者可以自己指定springboot启动默认要扫描的包,使用注解
@ComponentScan(basePackages = "com.liuzeyu.controller.")
<mark>注意</mark>
启动类是不能写在Java目录下的在,这是很多小伙伴不能理解的。
否则启动直接报错:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/C:/Users/liuze/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar!/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$EmbeddedDatabaseConfiguration.class]; nested exception is java.lang.IllegalStateException: Could not evaluate condition on org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$EmbeddedDatabaseConfiguration due to org/springframework/dao/DataAccessException not found. Make sure your own configuration does not rely on that class. This can also happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)
为什么不能把启动类直接放到java的文件夹下应该要从@ComponentScan这个注解的作用说起, 这个注解的作用是告诉spring,哪里可以找到bean, 如果在启动类没有配置这个注解,则默认扫描机制将扫描<mark>启动类所在的包</mark>的同级目录和它的子包,也可以配置具体路径扫描。 基于这个作用所以不能把启动类放在Java文件下,首先Java文件不是一个包,其次它是一个资源文件。故只要一启动就会报错。
如有理解不到位,恳请指教。