那些年在毕设中踩过的坑——云E办项目

本文记录了一位学生在毕设中遇到的各类技术问题,包括Vue组件显示、SpringSecurity认证、Swagger测试、Redis连接、Vuex状态管理、前后端交互、数据持久化、WebSocket连接等。通过问题描述及解决方案,分享了在项目开发中常见的错误及解决思路,对初学者有一定参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那些年在毕设中踩过的坑——云E办项目


最近这段时间都在做毕设写论文,我的毕设就是根据B站上的项目“云E办”来做的,在做项目的过程中也遇到了很多的问题,我将这些问题汇总起来,希望能帮助更多有需要的小伙伴~

1. Vue创建项目后引入element-ui组件,页面不显示输出,浏览器控制台报错?

请添加图片描述
原因:版本匹配问题。

解决:element-ui只支持Vue 2.6以下的版本使用,Vue3.0要使用element-ui就要使用element-plus。

注:可以将 Vue 版本换成2.6以下的,也可以将 element-ui 换成 wlwment-plus。

请添加图片描述

2. 登录实体类实现类UserDetails?

由于对SpringSecurity框架不熟悉,所以并不了解其实现逻辑,所以就先记录下来了。

使用Spring Secret框架真正的登录方法就是通过UserDetails里面的loadUserByUserName() 方法实现的,登录之后返回的就是UserDetails。

3. 测试swagger时,启动项目报错?

错误提示:Failed to start bean 'documentationPluginsBootstrapper';

原因:版本匹配问题。

解决:因为 swagger 依赖 google 的 guava,而当前项目的 guava 版本与之不匹配。我使用的版本是当前最新的 swagger2 版本,所以我就将guava升到最新的版本:

<!-- swagger2 与 guava 匹配 -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>25.1-jre</version>
</dependency>

注意:出现"Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException"问题,是SpringBoot版本与swagger版本不兼容,将SpringBoot版本换成2.6.0以下的也可以。

4. 连接redis时出现错误:Caused by: java.lang.IllegalStateException: RedisConnectionFactory is required?

请添加图片描述
原因:自定义的RedisTemplate没有设置其连接方式。

解决:自定义RedisTemplate时,必须设置连接方式:

@Autowired
private RedisConnectionFactory redisConnectionFactory;
redisTemplate.setConnectionFactory(redisConnectionFactory);

5. 连接redis报错:Failed connecting to host 139.224.229.89:6379,连接超时?

原因:防火墙没有开放 redis 端口。

解决:服务器中的防火墙关闭,对应的远程连接也没有开启防火墙。

# 开启防火墙
systemctl start firewalld
# 开放对应端口6379
firewall-cmd --zone=public --add-port=6379/tcp --permanent
success
# 重启防火墙
firewall-cmd --reload
success
# 查看对应端口
firewall-cmd --zone=public --query-port=6379/tcp
yes
# 重启redis
redis-server /etc/redis.conf

6. 引入vuex后启动项目不报错,但是浏览器控制台报错:Uncaught TypeError: (0 , vue__WEBPACK_IMPORTED_MODULE_20__.reactive) is not a function?请添加图片描述

原因:又是版本匹配问题。

解决:报错时,使用是vuex@4 ,重新安装vuex@3 ,之后没有报错了。

7. 前后端联调,在页面上登录后不能正常获取菜单信息?请添加图片描述

原因:由于前端页面请求时没有携带令牌 token,导致没有访问权限。

解决:在前端的请求头加上token即可。

8. 存在vuex中的菜单数据刷新后丢失?

原因:vuex中的数据是存储在内存中的,刷新页面后会重新加载而至数据丢失。

解决:可以先将数据保存到缓存中,后更新vuex中的数据即可,也可以利用第三方插件来同步 vuex 与缓存中的数据。

// 持久化插件,将state数据全部保存到sessionStorage中,同时可以同步更新
plugins: [
	persistedState({ storage: window.sessionStorage })
],

9. 血的教训!!模糊查询get请求后端报404?

请添加图片描述
原因:前端请求路径错误。

解决:get请求和post请求传参方式不太相同,传递参数时一定要检查检查再检查请求路径是否正确!!
请添加图片描述

10. 使用@PathVariable和@RequestParam的区别?

@RequestParam主要用于接收 http://host:port/path?参数名=参数值 数据,这里后面也可以不跟参数值:

http://localhost:8887/test2?id=id2&name=name2

@PathVariable主要用于接收 http://host:port/path/{参数值} 数据:

@RequestMapping("test2")
public String testRequestParam(@RequestParam("id") String id, @RequestParam("name") String name) {
    return "id=" + id + ", name=" + name;
}

@GetMapping("/getAllPosition/{pageNum}/{pageSize}")
public PageInfo<Position> getAllPosition(HttpServletRequest request, @PathVariable(value = "pageNum") int pageNum,@PathVariable(value = "pageSize") int pageSize) {
    PageInfo<Position> pageInfo = positionService.getAllPosition(pageNum, pageSize);
    return pageInfo;
}

11. 蠢!修改密码功能,考虑到此功能可能被好几个地方调用,就专门写了个mapper.xml,更新语句报错?

AdminMapper.updatePassword attempted to return null from a method with a primitive return type (int).

原因:标签使用错误。

解决:更新语句的标签应该使用< update >< /update >,而不是< select >< /select >!!晕,可别用的太顺手咯…

12. 忘记密码功能:前端请求返回尚未登录!

原因:按常理来说,用户无需进行登录即可点击忘记密码功能,但是后端会对没有放行的请求做拦截处理,所以才会提示未登录。

解决:springsecurity框架对权限进行了设置,只需要放行此请求即可。请添加图片描述

13. 用户注册插入操作报错:Illegal overloaded getter method with ambiguous type for property ‘enabled’ in class ‘com.work.server.pojo.Admin’. This breaks the JavaBeans specification and can cause unpredictable results?

原因:在 Admin 这个类中定义了 enabled 属性,且在 Admin 类上使用了 @Data 注解,但是这个 Admin类又同时实现了 UserDetails 接口,并重写了 isEnabled 方法,这样就会导致出现上述的 Illegal overloaded getter method with ambiguous type for property enabled。由于在此处 isEnabled 方法和 getEnabled 方法的逻辑完全一致,因此两者均被当作 enabled 属性的 getter 方法。

解决:在被不需要生成getter方法的属性上添加@Getter(value = AccessLevel.NONE)注解。

同理如果不需要setter方法就在其上添加 @Setter(value = AccessLevel.NONE),注意此时加载类上的@Data注解依旧需要使用,因为其他的属性可能需要生成setter和getter方法。

14. 就离谱…登录成功之后路由不能成功跳转?

解决:刚开始我一直认为是前端路由的问题,测试了很久我才想起来去再测试一下后端接口是否正常,结果…下巴都给我吓掉了呜呜呜…

测试后端接口时,登录成功仍然返回null的用户信息?

因为后端获取用户信息的部分返回的Principal principal对象为null,说明没有判定用户已经登录。

但是登录之后 SecurityContextHolder.getContext().setAuthentication(authenticationToken); 中的 Principal 是存在的,这就很奇怪了,为什么数据传递不进去呢?

查了很多资料才知道,可能是因为请求没有走拦截链才导致的没有判定登录的,这时的我猛地想起来,当初为了懒省事,将/admin/**全部放行了,晕…
请添加图片描述

15. JSON序列化Redis读取出错?

Could not read JSON: Cannot construct instance of java.time.LocalDateTime(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

原因:序列化失败。

解决:在失败的字段,也就是实体类中时间属性,添加上以下注解:

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)

16. 导出员工数据报错?

我想要实现选中的员工做导出而不是将所有员工全部导出,这时就需要传递一个id的集合了。

nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List] with root cause

Missing URI template variable 'ids' for method parameter of type List]with root cause

也就是说,在传递参数时报错:
请添加图片描述
原因:因为获取控制器参数是在进入控制器方法之前(因为需要转换成控制器所需要的参数),所以肯定是在获取控制器参数之前出了问题。

那就是处理器映射过程中的问题了。

处理器映射需要把请求路径与 @RequestMapping 匹配,现在看来这个过程还需要对参数进行映射。

解决:在controller层传递参数时忘记加注解,才导致无法匹配参数。
请添加图片描述

注意:List集合可以使用@RequestParam注解进行强制匹配。

17. 启动SpringBoot集成RabbitMQ项目报错?

ERROR 9068 --- [ntContainer#0-4] o.s.a.r.l.SimpleMessageListenerContainer : Failed to check/redeclare auto-delete queue(s).

解决:
①因为没有赋予admin用户权限

# 添加admin用户,密码设置为admin。
sudo rabbitmqctl add_user  admin  admin  
# 赋予权限
sudo rabbitmqctl set_user_tags admin administrator 
# 赋予virtual host中所有资源的配置、写、读权限以便管理其中的资源
sudo rabbitmqctl  set_permissions -p / admin '.*' '.*' '.*'

②防火墙没有开启5672端口

# 开启防火墙
systemctl start firewalld
# 开放对应端口5672
firewall-cmd --zone=public --add-port=5672/tcp --permanent
success
# 重启防火墙
firewall-cmd --reloadsuccess
# 查看对应端口
firewall-cmd --zone=public --query-port=5672/tcp
yes
# 重启rabbitMQ
systemctl restart rabbitmq-server
​# 查看所有开放的端口
firewall-cmd --list-ports

18. 测试发送邮件服务报错?

org.thymeleaf.exceptions.TemplateInputException: Error resolving template

原因:找不到相应的 html 文件。

解决:在 thymeleaf 配置上加上 html的路径前缀,否则找不到相应的文件。
请添加图片描述
请添加图片描述

19. 个人中心里的操作报错?

  • 当更新个人信息同时附带个人权限,会发现报错:

    Cannot construct instance of org.springframework.security.core.GrantedAuthority(no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types
    请添加图片描述

  • 当把权限删除时,更新成功。

原因:这是因为 Admin 实体类实现了 UserDetails 接口,重写了 getAuthorities() 方法,但是 Admin实体类却没有对应的 Collection<? extends GrantedAuthority> 属性,也无法创建含有 Collection<? extends GrantedAuthority> 属性的构造函数。JSON无法进行反序列化,导致报错。

解决:自定义反序列化类,在 getAuthorities() 方法定义使用自定义的反序列化类进行:

/**
 * @Author qiaohaojie
 * @Date 2022/4/19
 * @Description: 自定义Authority解析器
 */
public class CustomAuthorityDeserializer extends JsonDeserializer {

    @Override
    public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectMapper mapper = (ObjectMapper) p.getCodec();
        // 读取json树
        JsonNode jsonNode = mapper.readTree(p);
        List<GrantedAuthority> grantedAuthorities = new LinkedList<>();
        Iterator<JsonNode> elements = jsonNode.elements();
        while (elements.hasNext()){
            JsonNode next = elements.next();
            // authority是传进来的参数
            JsonNode authority = next.get("authority");
            grantedAuthorities.add(new SimpleGrantedAuthority(authority.asText()));
        }
        return grantedAuthorities;
    }
}

请添加图片描述

20. 图片上传服务器测试报错:getStoreStorage fail, errno code: 2?

# 启动
service fdfs_trackerd start
service fdfs_storaged start

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
# 重启
service fdfs_trackerd restart
service fdfs_storaged restart
nginx -s reload

原因:查看错误日志发现:因为这个安装包是下载的别人的,这里的路径要改成自己的路径,启动后找不到 /home/yuqing/fastdfs/data 文件而导致启动失败。
请添加图片描述
解决:修改路径为自己的路径后重启即可。
请添加图片描述

21. 继20之后又报错:java.net.SocketTimeoutException: connect timed out?

原因:查阅了很多资料后发现是在:String[] strings = storageClient.upload_file(uploadFilePath, "jpg", null);报错的,说明上传的服务器有错误。

解决:经过某博主的启发,检查服务器端口后发现23000这个端口并未开启,开启后即可上传成功。

22. 图片上传成功,但是在浏览器上无法访问nginx?

解决:排查问题后发现是因为在浏览器上无法访问nginx才导致的无法访问图片,nginx错误日志中显示:worker process xxx exited on signal 11,尝试了很多办法之后仍然没有成功,最后重装了nginx后成功了。

23. 图片上传成功,可以访问nginx但访问图片报404?

查看错误日志发现,404是因为在服务器上无法找到相关路径而导致的错误:

/opt/soft_pkg/fastdfs-nginx-module/src/common.c, line: 870, file: /opt/fastdfs/storage/data/00/00/rBgy2WJfcqeASj-lABUZutu5HEs334.jpg not exist

查看相关配置文件发现,nginx代理的路径是/opt/fastfds/storage/data,但是此路径下并未存放图片信息:
请添加图片描述请添加图片描述

将nginx.conf配置文件的代理路径修改成正确的代理路径(存放图片的路径) /opt/fastdfs/data 后,再次查看mod_fastdfs.conf 配置文件中的路径是否正确:
请添加图片描述

全部修改完成后,重新启动三个服务:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
nginx -s reload

访问成功!

请添加图片描述

24. 在显示员工基本资料时,调用后端接口返回数据正常,浏览器报错?

Property or method "emps" is not defined on the instance but referenced during render.

解决:这个问题说的是emps并未定义而导致的无法显示问题,我检查了很多遍还是没有发现有什么端倪,也百度了好久,直到看见一个博主的提醒,才去检查data是否拼写正确:

请添加图片描述
真的是大无语了家人们…由于粗心就顺手敲回车,但是根本没在意是date还是data。

25. 导出员工功能,浏览器报错?

请添加图片描述
解决:

  • ①前端向后端发送请求时报错,说明请求有问题,经查发现,在传递参数时出错:
    请添加图片描述
    required 默认是 true,也就是说 ids 这个参数是必传的,在前端传递参数时,格式有错误:
    请添加图片描述
    所以导致两个请求都无法到达。

  • ②修改前端传递的参数,将遍历的id放进数组中传递:

    请添加图片描述

  • ③然鹅继续报错:
    请添加图片描述
    检查了好长时间才发现,是请求路径写错了…晕…改正后即可正常实现下载excel功能。请添加图片描述

26. 高级搜索功能,添加或删除搜索条件时,当前页不是第一页?

问题描述:

第一次搜索时分页显示正常,分页功能可以正常跳转。

假如我按照 中共党员 这个条件搜索后,跳转到了第三页,由于结果列表过多,我需要再次添加过滤条件 初级工程师,但是当前的两个条件查询到的结果只有三条,也就是说一页就可以显示完全了,然鹅此时传递给后台的this.pageNum=3,那么取值会取第三页的数据(可是正确结果只有一页三条数据),当然是取不到值的。

解决:

我只需要将this.pageNum=1即可,可是这样就会出现所有结果都会被强制定位到第一页。

所以,我们只需要在手动点击搜索按钮时(也就是触发搜索的地方)传递一个参数即可:

<el-button @click="advancedSearche(pageNum=1)">搜索</el-button>

method: {
    advancedSearche(pageNum=0){
        if(pageNum == 1){
            // 只有pageNum这个参数有值时(也就是自己触发搜索按钮了)才定位到第一页
            this.pageNum = 1;
    	}
	}
}

27. 在线聊天功能,导入stompjs后启动报错?

Can't resolve 'net' in '..\..\stompjs\lib'

找不到模块:错误:无法解析“node_modules/stompjs/lib”中的“net”(Module not found: Error: Can’t resolve ‘net’ in ‘node_modules/stompjs/lib’)

解决:

安装缺少的依赖项:

npm i net -S

28. websocket连接报错:Cannot read properties of null (reading ‘send’)?

原因:send方法未定义?也就是在刷新页面后不会重新连接,导致消息发送失败。

解决:在消息接收页面挂载 connect() 方法,重新连接:

mounted() {
	this.$store.dispatch('connect');
},

29. 模糊搜索admin报错?

nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]->com.work.server.pojo.Admin["authorities"])]

原因:出现这个问题的原因在于,我的实体类 Admin 实现了 UserDeatils 接口,继承了 UserDeatils 的 getAuthorities()方法,导致返回实体的时候出现了 Json 格式不能解析空list的问题。

解决:
新建 AdminVo 实体类,并且带有 Admin 所有属性,在 mybatis 中 ResultMap 的 type 为AdminVo,成功解决问题!

至于为什么实体类实现了 UserDeatils 接口后会出现查询返回 Json 不能成功映射的问题还未知晓。

30. 用户修改密码功能,表单验证通过后点击提交按钮,无报错无反应?

请添加图片描述请添加图片描述
解决:每一个 if 都对应了一个 else 并且每个条件下都要 callback 以确保在不同情况下都会执行callback。所以要在验证时加上else的callback()。
请添加图片描述

总结

好啦,到这里我的项目就结束了,项目里所实现的功能也都是视频里的内容而并没有做过多的补充和完善。

我将项目中遇到的问题都记录下来,希望可以帮助到更多的小伙伴,虽然有的解决办法是很死板的也并不适用于企业项目的开发,但是对于目前这个项目来说已经足够了,如果有什么说的不对的地方,欢迎大家指正。

当我现在重新来回顾这些内容、记录下这些文字时,发现离毕业也只有一步之遥了,说实话心里还是有一丢丢不舍的(哭唧唧)。但是这也只是人生的开始,革命尚未成功,少年还需努力…

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值