文章目录
前言
这里是我学习SpringBoot的过程中,遇到的一些问题,留作记录。方便以后排坑。1 SpringBoot启动报错
1.1 现象
启动的项目的时候,直接就是下面这张图上的错,没有明确提示,就是启动不起来。
1.2 检查思路
① 项目启动别不起来,但是没有报Service、mapper或者数据库方面的错,说明大概率,代码没有运行到这几个部 分,或者说运行过去但是没问题。
② 那么剩下的文件就是pom.xml、静态文件(只有几张图片)和启动类了。
③ 控制台的报错信息的蓝色字体部分,是我的代码启动类名,所以,就先排查这个类;如下
④ 检查之后发现,启动方法,中的参数应该是启动类的class文件,针对我的项目来说,就是ConfigApplication.class,但是明显的,传的是错误的;改正之后在运行,就可以了
1.3 出错原因
出错的原因是我的类名ConfigApplication的字母的Conifg和spring注解@Configuratiion出现重复,在写的时候,idea会自动关联,写完之后,有没有回过头检查,所以就悲剧了。。。
1.4 改正之后的代码
package com.kaikeba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author sunyang
* @date 2021/5/28 9:34
*/
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class);
}
}
2 访问出错
2.1 现象
前端网页:
后端控制台
2.2 检查思路
① 后台的报错就比较明显,访问/hello的时候出错,请检查viewResplver 试图解析器;
② 那就去对应的控制器哪里去检查
2.3 出错原因
① Controller类上注解是@Controller,这是学习SSM时,控制器使用的注解,他可以返回一个ModelAndView(视图)或者字符串(返回的前端页面),
②我的代码是下面这样,所以springboot会根据我返回的内容去查找一个名为hello的静态文件,很明显,我的项目中没有这个文件,所以出错。
package com.kaikeba.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
/**
* @author sunyang
* @date 2021/5/28 9:33
*/
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
③ 所以我们要达到预期的效果(网页显示hello),那么久要让欠点控制器明白我们返回的是数据,并不是视图名称;
2.4 解决方案
2.4.1 添加@ResponseBody注解
在原有@Controller注解的基础上为方法增加@ResponseBody注解;表示这个方法返回的是数据,并不是静态视图的名称。代码如下:
package com.kaikeba.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
/**
* @author sunyang
* @date 2021/5/28 9:33
*/
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "hello";
}
}
测试结果:
2.4.2 @RestController
使用@RestController注解,其源码如下:
可以看出@RestController注解其实就是相当于 @ResponseBody + @Controller注解,
修改代码:
package com.kaikeba.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author sunyang
* @date 2021/5/28 9:33
*/
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello 222";
}
}
测试结果:
PS:@RestController是作用在类上的,所以在类上使用之后,程序将会把所有的方法返回值都当做是结果数据而不是将要跳转的视图;所以,如果一个Controller控制器中,既返回视图,有返回数据,还是建议用第一种解决方法。
3 配置类报错
3.1 现象
这个报错信息就很明确了,找不到指定的配置文件名,
3.2 分析
我们的配置文件明明是存在的,但是有这个报错,说明是程序找不到,找不到,那肯定就会配置的查找路径不对。
3.3 解决
经过查询后,发现,配置类上的@PropertySource()中的额classpath后面不能加* 号。
4 测试文件中的报错
4.1 现象
测试文件中的UserMapper文件提示找不到,但是运行又是正确的
4.2 分析
① 说明这个报错不影响程序运行;
② 说明预编译时候找不到,但是运行的时候能找到;
③ UserMapper是一个接口,是在运行时程序动态生成的代理类;
④ 综上,那就有可能是预编译时,找不到其代理类而报错。
4.3 解决
4.3.1 增加required属性
经查询发现,@Autowired注解,直接使用时,要求使用的Bean必须已经存在与容器中,否则就会报错(报错内容如上面的图片所示),只要增加"required=false"属性,不增加该属性是默认是true,所以我们增加上"required=false"属性,通知项目,不用在编译时存在,即可,如下图:
运行结果:
4.3.2 使用@Resource注解
因为@Resources没有对Bean类是否存在的硬性要求,所以不会检查,当然就不会报错了:
运行结果: