guli学苑 day6

今天解决了一个上传文件结果读取失败的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();
    }
}

在这里调用了自动注入的实体类,用户只需要上传一个文件就好了,而不是上传好一个文件之后又要用户自己提供一个内部的对象(别人怎么知道你写的什么屎对象)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值