今天解决了一个上传文件结果读取失败的bug(其实是自己学的不行导致的)
// 通过swagger来检查当前行的一级分类是否存在
public EduSubject existOneSubject(EduSubjectService eduSubjectService,String name){
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("title",name); // 形参name就是当前一级分类的名称
wrapper.eq("parent_id","0");// 以为检查一级分类的parent_id必为零,所以不需要以形参来传递其数值
// 使用wrapper来查找数据库
EduSubject oneSubject = eduSubjectService.getOne(wrapper);
return oneSubject;
}
上面是一段在自己设置的监听器里面的一部分代码,目的是实现课程的多级分类,这里是对于一级分类的判断,二级分类的判断方法里面也有调用这个getOne方法。
当我使用swagger来上传文件测试的时候,swagger显示我上传文件成功
然而IDEA里面报错了,报错内容如下
Caused by: java.lang.IllegalArgumentException: Invoked method public abstract java.lang.Object com.baomidou.mybatisplus.extension.service.IService.getOne(com.baomidou.mybatisplus.core.conditions.Wrapper,boolean) is no accessor method!
AI回复:这个错误信息是Java程序在运行时抛出的异常,具体来说是java.lang.IllegalArgumentException
。异常信息表明在使用MyBatis-Plus框架时,调用了一个抽象方法getOne
,但是这个方法并没有被正确地实现或配置为可访问的方法。
这说明你尝试调用的方法getOne
是抽象的,意味着它没有具体的实现。IService
是MyBatis-Plus提供的一个服务接口,它定义了一些通用的数据库操作方法,但这些方法需要在实现类中具体实现。
上面的错误信息是在说我使用的subjectService类对象里面的getOne方法是一个抽象方法,没有被实现就被我调用了。
于是经过了几个小时的排查,发现了错误点,是我的Controller类写错了代码
错误的代码如下:
@RestController
@RequestMapping("/eduService/subject")
@CrossOrigin //解决跨域问题
public class EduSubjectController {
@Autowired
private EduSubjectService eduSubjectService;
@PostMapping("addSubject")
public R addSubject(MultipartFile file,EduSubjectService subjectService){ // 用户上传的文件
// 添加课程分类
// 读取上传的文件,将文件内容读取出来
eduSubjectService.saveSubject(file, subjectService);
return R.ok();
}
}
自己的理解:
// 我们在这里自动注入了一个Service,但是又在下面的方法内部使用了一个形参,并且将形参作为了Service层的方法返回了。
// 那么这里的自动注入的对象就没有起到了作用,实际上是使用这里的自动注入的对象,而我在下面自己创建了一个抽象类的对象。这就是报错的原因。
// 我使用了一个自己在方法内部创建的对象,而不是使用了由spring管理的自动注入了的对象,这里的对象是我在内部封装好的对象,使用了自动注入之后就会将我具体实现的实现类给注入,而不仅仅是一个Service层的抽象类,是一个ServiceImpl类
下面是修改之后正确实现目的的代码:
@RestController
@RequestMapping("/eduService/subject")
@CrossOrigin
public class EduSubjectController {
@Autowired
private EduSubjectService eduSubjectService;
@PostMapping("addSubject")
public R addSubject(MultipartFile file){ // 用户上传的文件
// 添加课程分类
// 读取上传的文件,将文件内容读取出来
eduSubjectService.saveSubject(file, eduSubjectService);
return R.ok();
}
}
在这里调用了自动注入的实体类,用户只需要上传一个文件就好了,而不是上传好一个文件之后又要用户自己提供一个内部的对象(别人怎么知道你写的什么屎对象)