1.报错
过程:在项目测试时删除了某个图片资源后报错:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
[Request processing failed; nested exception is java.lang.NullPointerException] with root cause.
2.分析
常见是属性注入的问题,如
1)Controller类的 @ResponseBody没有加;
2)使用mapper接口或service接口的地方没有加 @Autowired或是没有通过@Bean提交管理对象
3)有的成员变量是主动new出来的,有的则是通过注解提交给SpringBoot管理,当一个new出来的对象类中包含其他注解出来的对象时,也会出错,如:
Service:
public class DemoService {
@Autowired
private DemoMapper demoMapper;
public List<Demo> findAll(){
List<Demo> list=DemoMapper.findAll();
System.out.println("demo");
return list;
}
}
Controller
@RestController
public class HelloController {
DemoService demoService=new DemoService();
@RequestMapping("findAll")
public List<Demo> findAll(){
return DemoService.findAll();
}
}
new 出来的类是一个使用了注解提交对象的类时会报错;
这些常见的原因,容易解决,只要该加注解的加上注解就可以了。
4)错误经过
但我在项目中出现注解问题之外的报错,查看Lombok日志输出和报错:
输出一直正常,指导最后查询的是结果数为0,即Total:0,后面开始报错,嵌套的异常是空指针异常,肯定是哪边的值为NULL,根据报错找到了对应的类和方法:
逻辑上iExhibitImgMapper.getExhibitImg会返回一个ExhibitImgVO实体类对象,但日志显示返回的ExhibitImgVO数为0,即NULL,会发现一个NULL值去调用实体类的方法getImgurl()就肯定会报错,意思是,exhibitImgVO.getImgurl()时,SpringBoot找不到exhibitImgVO对象,因为它是个Null值,提示是不是没通过注解提交对象。的确问题确实出在这个上面,接着改错。
3.解决
ExhibitImgVO exhibitImgVO =iExhibitImgMapper.getExhibitImg(tableName,id);
BeanUtils.copyProperties(exhibitPrefVOList.get(i),exhibitPrefTotalVO);
if (exhibitImgVO==null){
exhibitPrefTotalVO.setFirstImgUrl(null);
}else {
exhibitPrefTotalVO.setFirstImgUrl(exhibitImgVO.getImgurl());
}
exhibitPrefTotalVOList.add(i,exhibitPrefTotalVO);
我进行了条件判断,如果exhibitImgVO不为NULL时才执行exhibitImgVO.getImgurl(),避免因为对象为Null却调用实体类方法而报错。
每个人遇到的情况都不一定相同,但希望我的改错经历可以对你有所借鉴。