# studev **Repository Path**: chen-xiuzhe/studev ## Basic Information - **Project Name**: studev - **Description**: 学生个性化成长平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-07 - **Last Updated**: 2024-07-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 学生个性化成长平台 # 联系作者 2033244875 ###后端错误总结 1. 记录一下,还有个shab的事,就是加了跨域配置类不生效,第二天打开idea又好了,idea真傻逼,shab坑1, 不过虽然不报错了,但跨域配置依然没生效,最终还是使用@CossOrign注解,估计是不同的Springboot版本导致不同的配置方法,但之前明明也是2.3.7版本,这样配置就管用了??? 2. redis拒绝远程连接,但我明明已经修改了配置文件了鸭,把protectedmode:no了,为什么重启了n次,还是不好? 原来redis启动的时候要指定使用那个配置文件读,才会生效这个配置文件的内容,shab坑2 3. 好不容易redis远程连接上了,使用redisTemplate又无法自动注入,redis的配置类粘过来也报错,为什么哪?明明是两种操作redis的不同工具呀!(后来才发现并不是报的这两个的错) 又半个小时找坑,原来是properties中加了jedis的配置项(jedis的池技术),而pom中只引了redisTemplate,jedis依赖忘记加上,这是我的问题了,因为redis用的不熟导致的 (1)jedis结合jedisPool使用既可以有高性能又可以保证redis的连接可控。在性能要求、并发操作不高的场景建议使用RedisTemplate,在并发高,性能要求高的场景下建议使用jedis。 (2)RedisTemplate与spring整合较好,配置、操作比较简单。 4. ES8的坑,ES8没啥坑,主要是自己有个地方逻辑没注意到,导致一个空索引,当时是这样报的错,后来排错发现是ES8返回hits数据时,因为没有匹配到结果,而我还在取结果中的第一个值,导致报错 5. 拦截器踩坑,或者说Thredlocal踩坑,因为ThreadLocal.get拿到用户信息,当时因为未将接口添加到拦截器中,在与前端联调的时候,发现Threadlocal.get一直报空指针,当时脑子 短路,居然也没想到,来回排错,才意识到。 6. 七牛云踩坑,上网找七牛云的csdn博客,怎么也没找到怎么将文件上传到某一个捅下的指定文件夹,同时加水印功能是直接在原服务器文件后面拼接?参数,已实现功能 7、注意activemq与jre的版本对应问题,其实官网写的很明确,不过我眼*,没看见,注意不要下载5.17.3,该版本要求jdk>11 2024.03.12 错误续更 Springboot+Websocket中@Autowired注入service为null的解决方法 问题原因 Spring默认对bean的管理都是单例(singleton),和 websocket (多对象)相冲突。 项目启动时初始化,会初始化 websocket (非用户连接的),spring 同时会为其注入 service,该对象的 service 不是 null,被成功注入。 但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当用户建立新的连接时,系统又会创建一个新的 websocket 对象,这时不会再次注入了,所以导致只要是用户连接创建的 websocket 对象,都不能再注入了,后面的注入均为null。 解决方案:使用静态变量,加set注入 `@ServerEndpoint("/websocket/{userId}") @Component //关键点1 public class WebSocket { private static UserService userService; //关键点2 @Autowired //关键点3 public void setUserService (UserService userService){ WebSocket.userService = userService; } //略去其他代码... @OnMessage public void onMessage(String message, Session session) { if(!StringUtils.isEmpty(message)){ try { log.info("收到用户【{}】的消息: {}",this.userId,message); WebSocket.userService.helloService(); //关键点4 session.getBasicRemote().sendText("收到 "+this.userId+" 的消息 "); }catch (Exception e){ e.printStackTrace(); } } } }` 2024.03.31 突然想起来坑点,特意补充 webSocket携带token,前端设置倒是容易,配置完之后,header里面会包含一个参数为Sec-WebSocket-Protocol的请求头 `this.ws = new WebSocket("ws://localhost:8088/chat",[this.$store.state.token])` 只需要在WebSocket初始化时,配置token即可,问题是后端如何实现拦截,试了各种拦截器无法实现 终于是被我发现了 WebsocketConfig extends ServerEndpointConfig.Configurator可以拦截到握手时发送的参数 通过重写重写modifyHandshake方法,可以获取Sec-WebSocket-Protocol请求头,然后就是上面2024.03.12的坑点,需要将单例的bean 修改为一次请求一个新的实例,不再使用springboot默认的单例bean模式。 暂时更到这里 ###前端错误总结 1.首先是评论区功能,因为原项目里并没有发表后评论后自动刷新评论区,在做代码更改时,一级评论在重新获取评论数据后确实能刷新评论区时,但子评论区并没有刷新,虽然通过$emit()再次调用获取列表后, 依然没有刷新,原因是子评论要刷新需要重新获取子评论的数据,后端应该返回新的子评论列表。 2.至今仍未想明白的一个是智能问答模块的消息问答,使用vue该如何进行消息对答更新,最终还是使用了jQ。 ###内网穿透 1.因为python部署模型时,在服务器进行识别时,发现服务器带不动,因此考虑使用frp做内网穿透,但在使用frp进行内网穿透时,遇到bug,各种bug,最后放弃了,如果有后继者看到,不要采用frp,请 使用花生壳进行内网穿透。