能力说明:
掌握封装、继承和多态设计Java类的方法,能够设计较复杂的Java类结构;能够使用泛型与集合的概念与方法,创建泛型类,使用ArrayList,TreeSet,TreeMap等对象掌握Java I/O原理从控制台读取和写入数据,能够使用BufferedReader,BufferedWriter文件创建输出、输入对象。
暂时未有相关云产品技术能力~
1、高端的程序员通常具有以下朴素的编程方式: 代码简洁易读,遵循编程规范和最佳实践;善于利用已有的工具和框架,不重复造轮子;深入理解底层原理,不局限于表面现象;善于思考和分析问题,注重解决问题本质;勤于学习和探索新技术,跟上技术发展的潮流。... 2、程序员必须掌握的技术包括: 编程语言:至少掌握一门编程语言,如Java、Python等;数据库技术:熟悉SQL语言和常用数据库的使用方法;网络编程:了解网络协议和常用的网络编程库;操作系统:对操作系统的原理和常见操作有基本了解;数据结构与算法:对常用数据结构和算法进行学习和掌握;前端技术:了解HTML、CSS、Javascript等前端技术,以及常用前端框架如React、Vue等;后端框架:熟悉至少一种后端框架,如Spring、Django等。... 3、让我看了直呼牛逼的编程方式有: 创造性地利用已有技术解决问题,如使用深度学习模型解决自然语言处理问题;高效利用计算机资源,如使用并行计算技术加速计算;创新地构思产品和解决方案,如设计出令人惊叹的应用程序界面;开源精神,为开源社区贡献优秀的代码和项目;高质量的代码风格和注释,让其它程序员易于理解和维护代码。...
一、前言🔥 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、版本说明🔥环境:springboot2.3.1.REALSE + jdk1.8 + mysql5.6三、报错详情🔥 又是找bug的一天,非常之离谱!又是给同事排错,虽然对于我而言,其实排错无非就是debug,但是业务逻辑不清楚的地方,对自己而言还得盯人家写的理一遍,多耽误事儿呀!但是总不能放任报错不管吧,能咋办,改bug呗! 此处控制台是直接空指针,一般就是返回集合或对象为空,但你没有进行验空就直接使用它来获取里头的元素或属性就会报空指针。 所以具体问题咋哪儿呢?其实就只需要看控制台打印的报错位于哪里,去那里degue看一眼,其实八九不离十就按我说的思路排一遍就清楚了。如下是具体控制台报错截图:四、报错分析🔥 我们看报错显示在ChartsServiceImpl.java文件的第437行,我们直接打开这个文件,去看这块代码,437行是一个map.put()的过程,如果这行代码导致报错,那必然是pg.getProfessionalGroupName()这里获取属性报错!我们再看pg是遍历professionalGroups集合的一个对象,那就说明,这个对象里头的professionalGroupName为null,才会导致获取报空。 可以看一下,确实是因为pg对象为null,获取其professionalGroupName属性而报错。 为了验证我的猜测,我打算直接本地debug断点在获取professionalGroups集合这一行,看看professionalGroups集合里头装的到底是什么? 好家伙,大家请看,果不其然,professionalGroups``(ArrayList),其size = 2,但具体显示All elements are null。 一般情况都是直接展示具体对象值,但是这里却展示All elements are null,那我们来分析一下为何会产生All elements are null问题,首先我们都知道List是允许插入空值,然后,mybtis映射到List有空值。那么Mybatis映射到List有空值,就有可能是以下情况了sql语句映射有问题,可能sql本身产生了一条为null的记录。我们继续排查,检查一下这个方法所执行的源sql。大家请看,首先sql语法是没问题的。 返回类型是个对象,且使用的是resultType,我们都知道使用resultType指定返回对象pojo,其必定要求sql返回字段名的驼峰命名要与你指定的pojo属性要一致,否则是无法映射上该字段的。 所以我们直接打开该FindByProfessionalGroupTopFiveVo对象看一眼,一切就会真相大白了!好家伙,果然是驼峰命名不一致,sql没有指定别名,所以转驼峰是professionalGroup,而vo中所定义的属性名又为professionalGroupName。所以,推理到这里,小伙伴们都知道应该怎么改了么?五、解决方案🔥为解决映射关系,以下我提供的三种解决方案,仅供参考。1️⃣方案一:只修改vo,将FindByProfessionalGroupTopFiveVo对象中的professionalGroupName属性名改成professionalGroup。具体演示请看如下:2️⃣方案二:只修改源sql,将professional_group 进行别名,指定名称为professionalGroupName即可。具体演示请看如下:3️⃣方案三:使用resultMap进行指定返回类型,然后定义一个resultMap,其中指定一下映射名。具体演示请看如下:... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、版本说明🔥环境:springboot2.3.1.REALSE + jdk1.8 + mysql5.6/oracle8三、报错排查🔥 今天给大家科普一个很典型的报错,很别致,因为在常用的mysql数据库中是不会由于该问题报错的,这个错是只发生在oracle数据库中,那究竟是什么报错呢? 这件事还得从我之前接手的那个项目说起,因为它用的数据库正是oracle,虽然现在oracle明令收费,企业一般得购买才能使用,但是不涉及推广使用,私下使用,还是可以的,所以这个问题就在我不常见的视野中发生了。 ORA-00911报错!跟mysql报错方式很雷同啊。正是这个报错,有小伙伴知道是啥问题么?如果还有小伙伴不知道,那么请看我,教你一遍,只需要看一遍,你便永远会记得它!好吧!那么我就以这个ORA-00911报错开始讲起。四、报错分析🔥我们先来看一段该报错截图: 其实从以上这段截图中,就能分析并且定位到该sql,但是如果你看了我给你分析的方案之后,你可以第一眼排查是不是该问题导致,so?你们接着看。 像ORA-00911报错,发生的报错的场景会很多,你们知道有哪些么?比如是我诺列的一些,仅供参考:比如sql语句中有输入中文逗号(全角逗号)。比如sql语句中实际语句和列类型不匹配,比如将数值列赋值为字符串。比如sql语句末尾带有分号(" ; ")结尾。... ... 所以,至于推理到【无效字符】,那就简单很多了,你只需要检查一下你的sql语句末尾是否带有分号。 因为oracle没有mysql那么智能,并不能解析带分号的sql语句。其实犯这个问题,也情理之中。像常写java或者C的小伙伴,其语法就是语句结束必须以分号结束,当你手写sql,很正常也是会分号结尾,从而也就导致了这一次事故的发生。 所以在使用oracle 连接库时,你就记得不应该在sql上加分号!它不支持解析。五、解决方案🔥 报错原因就是你oracle sql语句末尾带有";",把分号去掉就ok了。你学会了吗? 而我也测试了mysql数据库中自定义sql,无论你是在mapper.java手写sql还是mapper.xml手写sql,都是支持解析的,不会有报错的风险。XxxMapper.javaXxxMapper.xml 以上是我本地实测是没有任何问题的。所以说mysql使用起来还是较为顺手呀。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、版本说明🔥环境:springboot2.3.2.REALSE + jdk1.8 + mysql5.6三、报错排查🔥 这是一则典型报错。不知道有的小伙伴有没有一眼看出来,问题出在哪里?其实你看报错信息,特别是我如下圈起来的,已经非常明显了。 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'user': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'user.userName' in value "${user.userName}"四、报错分析🔥 发生这种事其实很常见,因为项目不是一个人开发全程开发,多人线上协同,很多时候代码冲突会很常有,于是及其修改同一个配置文件,这回我刚更新远程代码,结果启动就直接报错。如下是完整报错截图: 事故缘由很简单,那就是因为application.yaml的active没有更变,还是指定的dev配置,但是dev没有及时同步test环境的配置,所以才造成获取${user.userName} bean找不到而启动报错啦。 一般遇到这种报错,第一排查你所获取的参数是否存在于你所active指定的配置文件里,第二就是排查你获取的参数名是否与你所active指定的配置文件所定义的参数名一致。你只要排查这两步,八九不离十,就是上述这两问题造成的。 我是当前指定的是application-test.yaml配置,所以就只需要检查这个文件即可,你们依据你们的项目设定情况而定。五、解决方案🔥 想要解决这一问题,其实是非常简单的。如下我可以提供两种有效解决方式,仅供参考。方式二虽是解决该启动不报错,但并不是非常优雅的。1️⃣方式一 配置文件中,加上对应报错的那几个全局变量。比如我如下报错就是指没有默认值。配置文件这一块由于切换active 没有同步,test环境上没有这一块变量。于是才报错。在我指定的配置文件application-test.yaml 中添加该参数。user: userName: 张三 sex: 男 age: 18如上即可解决该报错问题。启动正常!2️⃣方式二 在一般配置的时候,都会给定参数默认值。虽然也能有效避免你配置文件不存在变量时报错的事故发生。@Value("${user.userName:张三}") private String userName; @Value("${user.sex:男}") private String sex; @Value("${user.age:18}") private Integer age;实际设置截图:仅供参考 总结:其实是两种方案结合起来才是最真的写法。以防万一配置忘了加或者active切换没有及时同步而导致报错比采用读取默认配置的方式代价要大,所以一般在配置全局变量时,都是会给定变量默认值,但一定要给定有意义的变量默认值,好在第一时间能提醒被排查到是默认变量在启用效果。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、版本说明🔥环境:springboot2.3.2.REALSE + jdk1.8 + mysql5.6三、报错排查🔥 这项目也是前几天我接手的一个旧项目,然后事故发生在我运行项目时暴露出来的,老项目由于开发人员都已经离职不在了,就算是遇到问题,也只能根据残留的文档加上自己积累的业务经验进行综合评估。 然后这个报错,其实很好定位,因为报错信息提及了重点对象,大家请看如下我画起的重点部分。红色字重点报错信息如下: Unsatisfied dependency expressed through field 'iLogInfoService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'logInfoServiceImpl': Unsatisfied dependency expressed through field 'baseMapper';完整报错截图如下:四、报错分析🔥 看完上面这段报错,其实你作为一个开发者,其实这种错非常的常见,如下是我总结的两点,都是会有可能造成该报错的诞生,仅供参考:可 能性1:实现类(XxxServiceImpl)没有加@Service注解。没有的话请把这个注解加上。可能性2:mapper类没有注入进去。可以在项目启动类上面加个全盘扫描或者指定扫描其下的任何包,注解使用它即可@MapperScan("path"),其中path为你的扫描路径。五、解决方案🔥 看了如上分析,其实定位错就很好办了,一我是直接检查了报错所提示的ILogInfoServiceImpl接口实现类,它是有@Service注解修饰,所以排除可能性1这种情况。 接着我检查了项目启动类,果不其然,没有添加@MapperScan()这个注解,难怪会报XxxMapper依赖找不到的情况呢?所以我针对该报错属于可能性2,由于缺失dao层的路径扫描,从而类无法自动注入而导致该报错。所以我在我的项目启动类上加上了dao路径扫描配置。具体添加请看如下:@MapperScan("com.example.demo.dao")// 扫描mybatis的映射器六、@MapperScan注解介绍1、作用 通过@MapperScan这个注解可以指定要扫描的Mapper接口类的包路径;然后包下面的所有接口在编译之后都会生成相应的实现类。2、写法方式 首先在使用该注解的基础上,我们可以来了解一下有哪些方式这个注解是可以支持的,大多数场景都是指配置一个dao包,但是有的项目会区分数据库源就会定义多个,那么像这类场景,@MapperScan注解还适用么?答案是啃得的,大家请看下方:通过@MapperScan可以具体指定要扫描的Mapper接口类的包路径。具体演示如下:仅供参考@MapperScan("com.example.review.dao") 也可以在路径中可以使用[ * ]作为通配符对包名进行匹配扫描。具体演示如下:仅供参考@MapperScan("com.example.review.*.dao") 或者也可以使用@MapperScan注解对多个包路径进行扫描。具体演示如下:仅供参考@MapperScan("com.example.review.mapper1.dao","com.example.review.mapper2.dao")... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~七、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出八、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、版本说明🔥环境:springboot2.3.2.REALSE + jdk1.8 + mysql5.6三、事故发生缘由🔥 还是前几天接手的一个旧项目,由于我是看了没有代码等爆红,于是直接来启动项目瞅瞅,是否有哪些报错?从而好定位bug并解决。我可真是个小机灵,果然有报错啊,坑不是一般的坑,但是报错信息我想有必要给大家瞅瞅,因为我之前是有遇到类似的bug报错,现在我就来考考大家,看看能不能从报错上入手并能提供有效的解决方案?核心报错展示:Description: Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no embedded datasource could be auto-configured. Reason: Failed to determine a suitable driver class Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active)如下是控制台完整报错截图:四、解决方案🔥 其实在看到该报错信息的时候,我们就应该注意到一件事,‘spring.datasource.url’ 跟你的数据库连接有关系?是的,由于你项目有用到数据库组件,那么你就得配置一下数据源的相关信息,如果你暂时不需要数据库相关信息,那么你就可以把自动注入数据库配置的开关给关上。也就是在你的在启动类上,找到@SpringBootApplication注解,在这个注解之后加上如下这段:@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)具体添加截图: 或者你也可以这么做,在你的项目pom.xml配置上,找到有用到的数据库相关starter组件把它们都注释掉,然后刷新一下maven,再重启也是可以解决该报错的。 至于可能会很多小伙伴就会对那个自动配置开关产生疑问了,为啥要加这段啊?我之前对此也并没有加过啊?不要着急,我会给大家一个解释啦。首先:@SpringBootApplication注解,你们知道是干嘛用的吗?若不是很清楚,那么我来告诉大家,其实@SpringBootApplication注解它是如下三注解的复合体,由于每次都要写三个,显得有点麻烦,于是才造就了它,将其整合。@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan 总而言之,@SpringBootApplication注解是springboot项目的核心注解,目的就是开启自动配置。 然后对于为何要指定exclude = {DataSourceAutoConfiguration.class},顾名思义,表示排除自动注入数据库的配置。回到我们上述报错上,也是因为当前的项目其实并不需要数据源,但是有些依赖中引入了一些多余的依赖从而触发了该数据库自动化配置的加载,这不,报错连接也就由此诞生。 ... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~五、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出六、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、版本说明🔥环境:spring3.0 + mybatis 3.3 + spring-mybatis-1.3.0 + jsp三、事故发生缘由🔥 事情的经过很奇妙,我之前不是在带着技术组赶项目嘛,然后不知道老大在哪里接手了一个老旧项目,说当时开发结束了一直扔着就没有下文,现在要求我把这个项目给成功运行,且部署到服务器。我看到这条消息,我心想,几年前的项目,要还是使用的是不分离且页面使用jsp写的我就真奔溃了。 老大接着发给了我项目,我打开一看目录结构,我深深陷入了沉思。果然被我猜对了,还真是spring + mybatis + jsp。传统的ssm框架写的。 我先是将sql源文件导入进数据库,还好,mysql用的是5.6版本下的,顺利执行成功。看到这不规范的表结构设计,我有点堪忧!这还是能项目吗?写的这么这么不规范。 我看了下pom依赖配置,导入的是真的多,项目依赖陆续下载完成后,我运行application启动类。不用想,必报错。 还真是,那只能怎么办?耽误点时间看看报啥错呗,然后解决,总要先把项目运行不报错先,至于要迭代还是咋就不关我的事了。四、排错分析🔥控制台关键是爆了这么一段错:java.lang.NoClassDefFoundError: org/apache/ibatis/annotations/Mapper... 看到这段错,我回忆回忆,好像还真没有遇到过,那我得瞅瞅,代码中是否有报错的地方,没有,那我只能科学上网,查看下是否有相关解决方案,试了前三个解决方案,说是将@Mapper注解改成@MapperScan,就能解决,没有用。 最后,原来问题出在这里。这项目中用的spring 3.0 + spring-mybatis-1.3.0 + mybtis 3.3。好家伙,用的还是这种组合版本,版本之间冲突而已。 所以解决办法就是找一组兼容版本替换当前两jar依赖版本即可。控制台错误:打印截图:五、解决方案🔥更新使用的mybatis的版本为3.4.0版本以上即可!如下:<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> <scope>compile</scope> </dependency> 升级 mybatis版本后,我们再来重启项目,ok!大功告成。 想说句题外话,项目我是成功运行起来了,但是不敢保证里头的业务逻辑是否不会报错,这我也不知道,要是遇到逻辑报错,那更是头秃,我给老大回报完,我成功运行,也能正常登陆系统,结果来一句,带几个伙伴,把这个项目熟悉一下,熟悉一下?不是吧!我是真心不想看啊,写成这样。给你们举个例子啊,Controller是逻辑从头写到尾,基本不封装接口层与实现层,一个Controller接口几百行代码。艾玛... 家人们,如果是你们被安排,你们会接手并进行代码熟悉吗?... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥**环境:**vue3.0 + centos7.6 + tomcat 8.5三、事故发生缘由🔥 就在前几天,封闭在家一个多月,但封闭归封闭,项目还得做,由于部分小伙伴无法远程支持,所以部署的工作也有我来兼任,前端vue项目,所以我还是传统部署方式,webpack打包dist文件夹,然后依赖tomcat服务器发布。借此,也遇到了一个发布问题。 新打包发我的dist文件夹,我是同等命名后丢界tomcat的webapps里,然后启动。但遇到一个很奇怪的问题,虽然我是不清楚啊,但是前端小伙伴在我部署完后,投来了训斥的语气。以下对话是来自事故发生的当天,我跟前端小伙伴们。前端小伙伴A:"你是不是没部署好或者还是部署的旧包,明明这样式我是改掉了啊,怎么还是旧样式?? "。我:“一脸懵b,我是先停服务然后删包再上传包最后启动服务器,这流程讲道理不应该还是旧包啊?”我:"于是我怀疑自己是不是部署错了,我又重新上传了一遍新包,然后部署流程再来一次! "前端小伙伴A:"不行,还是老样式。我本地启动样式都变了,你服务器的问题?"。我:"浏览器缓存清了?。"前端小伙伴B:"那肯定啊!这不是常识嘛。"前端小伙伴A:"我再重新打个包给你吧,看看是不是我打包的方式不对..."... ...一等就是一刻钟!前端小伙伴A:"打包好了,发你vx了,bug菌,你重新部署一遍吧! 。"我:"ok!稍等。"我:"部署完了,你们看下,还是旧样式吗?"前端小伙伴B:"是的,会不会你服务器有缓存啊?。"我:"不应该吧?先不急着回答,我去确认一下..."四、排错分析🔥 这前端小伙伴的点题,我突然怀疑该不是tomcat会有缓存吧?我深信不疑。查询相关资料才发现,tomcat还真有缓存区,tomcat下有一个work目录,里面是用来存放页面缓存。 原来如此,那极有可能是它造成这一事故的发生。我立马去查,怎么将tomcat的缓存删掉,试试总不是坏事,我有点心虚,于是我将这work打包了个副本,如果发生不测,我也好复原。五、解决方案🔥那tomcat的缓存怎么清呢?我经测试,很简单,那就是直接把work/Catalina目录下的localhost文件夹删了,即可。 其实我们可以进到localhost文件夹看下,你们会发现,其实就是webapps里头的所有应用程序。扩展: 当tomcat启动时会去加载webapps目录下的应用程序。可以是文件夹、war包、jar包的形式发布应用。 我们 直接进到tomcat/work/Catalina下。然后把localhost文件夹都删了,不用害怕,待会儿重启一下它会自动生成的。 最后重启tomcat,我们再来页面看看,果不其然,页面新样式生效了。附上重启tomcat 的截图:... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存(上篇)Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥**环境:**jdk1.8 + springboot 2.3.1.RELEASE + mysql 5.6三、排错分析🔥 非常的奇怪,巨离谱!项目本地运行,时不时给你卡一下,然后控制台直接报错哗哗的一行行打印,且不光印象接口访问,navicat连接刷新数据库也是,直接卡住,这才多少数据,百来条,就直接查询也不至于啊? 前端放来狠话,说我接口频繁报错,一会儿又好了,给我紧急修复掉,太影响接口测试了。这把我给整的,很烦呀,这任谁也忍不了呀,必须解决! 放眼望去,从何开始定位问题呢?先申明一下不是锁表锁库所导致!这点是可以排除的。有哪位懂行的老哥能帮帮我的么?四、报错展示🔥如下是我项目控制台实际报错:WARN 4196 --- [nio-8889-exec-6] com.zaxxer.hikari.pool.PoolBase : master - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@4270a6d1 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. WARN 4196 --- [nio-8889-exec-6] com.zaxxer.hikari.pool.PoolBase : master - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@74713539 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. WARN 4196 --- [nio-8889-exec-6] com.zaxxer.hikari.pool.PoolBase : master - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@3b7db2ff (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. WARN 4196 --- [nio-8889-exec-6] com.zaxxer.hikari.pool.PoolBase : master - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@15d8fec0 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.五、解决方案🔥 单从报错信息入手:验证连接com.mysql.cj.jdbc失败,连接关闭后不允许操作。可以考虑减小的maxLifetime值。 但从报错信息入手,好像有点眉头,我们可以先查看一下你们的数据库超时参数配置。很有可能是超时则断开连接导致。 如下是两种尝试解决方案,仅供参考,如果方案1设置不好使请尝试方案2。不能保证方案对你们的情况是否有效,但是总比不尝试强!方案1: 执行如下这段命令查看数据库的各种超时配置参数:show variables like '%timeout%';实际查询结果如下: 从上述截图结果上可以明显看到:连接超时时间使用的是默认的8小时(28800秒),查阅资料发现在mysql 5以上的版本修改my.cnf这个文件,自定义配置wait_timeout 与 interactive_timeout,这个文件的位置位于你服务器里根目录下的 /etc/my.cnf路径下。vim编辑打开文件后,在 [mysqld] 的最后一行加上如下参数;wait_timeout= 86400我们直接修改超时等待时长为:wait_timeout= 86400实际修改截图:下面重启下mysqlservice mysqld restart实际运行截图:OK,我们可以执行命令检查一下。show variables like '%timeout%';方案2: 如果有的小伙伴修改了设置了my.cnf配置依旧参数没有变化,连接超时时间没有变更,那我们就在服务器直接通过命令连接,然后再设置参数试试:连接数据库命令:mysql -u root -h ip -p 然后输入数据库连接密码,后回车。 我们再直接执行一遍查询命令:show variables like ‘%timeout%‘; 可以看到,默认是8小时(28800秒),然后我们通过命令式的设置进行修改参数:set interactive_timeout=604800; set wait_timeout=604800;实际设置截图:都显示设置成功了。那我们直接查询一下: 这样只是说明你设置好了,但是要想立即生效,那我们还得重启下服务器:service mysqld restart实际设置截图: 可以看到,数据库已经重启好了,那我们再来监听看看,后端服务是否还会报连接超时问题吧!可以检查下数据库服务有没有重启OK,确保下。service mysqld status实际运行截图:... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存(上篇)Springboot系列(十六):集成easypoi实现Excel导出Springboot系列(十六):集成easypoi实现单word模板导出多页面Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥环境:jdk1.8 + springboot 2.3.1.RELEASE + mysql 5.6三、排错分析🔥 非常离谱啊,这回遇到的报错,我不就是做了个多文件上传么,怎么得,这还得给我来个bug尝尝?拉低我coding效率?这小心思也忒坏了吧。 我是用的springboot框架,谁都知道,现在的单应用都通过它来作为项目基础架构。然后涉及到一个需求是要支持文件的批量保存,眼瞅这需求,我一刻钟把它搞定。谁知道,在我火急火燎的写完后,意外发生了,给我报了个错,猝不及防,我正把postman测试接口反馈成功截图发给前端小伙伴呢,吓得我立马撤回了群消息,这心想,有bug,到时候他们接起来报错又得来diss我,我可不干!所以,我正打算定位问题并徒手干掉它!如下是主要报错信息:org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field files exceeds its maximum permitted size of 1048576 bytes.如下是完整报错信息截图,仅供参考: 中译过来就是说:该上传的文件大小超过最大上传大小,1048576字节(1Mb???),离谱啊就。眼瞅这报错,我大概心里知道是啥问题了;显示上传文件大小超过允许范围?超过谁的限制?这值得思考,定位到这儿,屏幕前的你是否察觉到什么端倪了没有? 我查阅相关文档,从这段文档中找到了答案。如下是具体官文描述:65.5 Handling Multipart File Uploads Spring Boot embraces the Servlet 3 javax.servlet.http.Part API to support uploading files. By default Spring Boot configures Spring MVC with a maximum file of 1Mb per file and a maximum of 10Mb of file data in a single request. You may override these values, as well as the location to which intermediate data is stored (e.g., to the /tmp directory) and the threshold past which data is flushed to disk by using the properties exposed in the MultipartProperties class. If you want to specify that files be unlimited, for example, set the multipart.maxFileSize property to -1.The multipart support is helpful when you want to receive multipart encoded file data as a @RequestParam-annotated parameter of type MultipartFile in a Spring MVC controller handler method.我从提取文档中提取了一些比较有价值的信息,我们可以从这句:Spring Boot configures Spring MVC with a maximum file of 1Mb per file and a maximum of 10Mb of file data in a single request...可以得知,说明对文件上传有默认最大限制,即最大可支持1MB的文件大小,在单个请求中最多可容纳10Mb的文件数据。且从这句disk by using the properties exposed in the MultipartProperties class...可以得知,这个文件上传大小限制可以自定义,可以在你的配置文件(.properties/.yaml)上自定义设置。(multipart.maxFileSize) ok!真相大白。知道为何报错了,我这就在配置文件上进行自定义配置。四、解决方案🔥 从官网中可以看出,对于不同的springboot版本有一定的差异配置。如下我就以.properties文件语法进行举例说明啦,若是.yaml配置的话,语法你们就自己转写一下就行啦(实在不会也可以评论区求助).Spring Boot 1.3.x或之前版本,配置如下:multipart.maxFileSize=100Mb multipart.maxRequestSize=1000MbSpring Boot 1.4.x版本及以上,配置如下:spring.http.multipart.maxFileSize=100Mb spring.http.multipart.maxRequestSize=1000MbSpring Boot 2.0版本及以上,配置如下:spring.servlet.multipart.max-file-size = 100MB spring.servlet.multipart.max-request-size = 1000MB💢注意:具体设置文件上限大小就依你们实际需求而定,我只是举个例子,设置的单文件最大100M,单个请求中文件总大小不超过1000M。如若没啥额外规定,按照我给的也足够满足啦。五、示例🔥如下是我实际在项目的配置文件所配置的文件默认上限,仅供参考:application-test.yaml#设置tomcat文件上传大小限制 spring: servlet: multipart: max-file-size: 100MB max-request-size: 1000MB ... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥**环境:**jdk1.8 + springboot 2.3.1 + mybatis-plus3.2 + mysql5.6三、排错分析🔥 我coding着正快要进入忘我境界,突然我的消息一直弹屏,我还是抓紧看看具体发生了啥吧。 于是我打开vx,看到群消息后,呆住!离谱????bug菌:"心想,不可能是我的问题的。"小伙伴:"bug菌啊,为啥我输入的中文保存后变成一串问号了啊??我也没做字符转码呀,今天就是这个情况。你赶紧看看,肯定又是你写的bug。难怪取名叫bug菌,名副其实!。"bug菌:"这么离谱?我啥也没变动啊,接口照旧呀,之前测了不是都正常嘛。怕不是要冤枉好人。"bug菌:"深吸了口气,好像想到了点啥?"bug菌:"那你再测一下别的新增接口,看看中文是不是也乱码?是只中文保存后变成了' ??? ',还是都变成' ??? '。"小伙伴:"别的接口也是!变成了不固定的问号。"小伙伴:"就是中文,输入的数字,字符串都不变。"bug菌:"好的,基本了解,这是后端bug,我马上定位问题并修改bug"。bug菌正火急火燎的赶往事故发生地。...小伙伴们,你们光到这儿,能精准定位问题是啥不?如果你心里没有啥解决方案,那么跟随 bug菌过来,看看他是如何一步步排查到事故现场把!我首先打开[ idea ]编辑器,运行[ debug ]模式。第一步:先确定,接口参数传到后端再到接口逻辑层中间是否有被转义?排查下来并没有,且sql执行也显示中文,如下是sql执行过程:第二步:排查一下,数据库数据保存情况,是否中午变问号了?ok!很明显,插入的中文乱码变成了一堆问号了。第三步:确定idea编辑器的编码格式 与数据库的编码格式否是一直?排查下来,设置的都是utf-8 编码。第四步:排查下来,事故是发生在sql执行上,我就想,sql执行时啥设置会对它有影响?真相大白!大家请看:发现了什么没有? 我的数据库连接配置竟然变了!!被谁给改掉了。查看git提交记录才发现,是被我昨晚定位另一个bug临时给改了,忘了把注释放开。到这儿,你们知道这个事故是啥了嘛?小伙伴们。四、解决方案🔥在你的配置文件中对配置数据库的url地址最后拼接一下如下这串,问题解决!!&useUnicode=true&characterEncoding=utf-8拓展:数据库连接url拼接这串有啥作用呢? 字面解读:使用Unicode字符集并且设置字符编码为utf-8。 其实真正它的作用分两方面:1、往数据库插入数据时: 数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。2、从数据库取出数据时: 数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。实际添加截图:最后咱们重启项目,再随便通过一个新增接口试试,问题解决没有!很明显,中文输入保存正常,接口获取时也正常,一切正常。**完美,收工!**perfect!! ... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~五、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出六、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥环境:阿里云服务器 + centos7.6三、 排错分析🔥 今天发生这件事,我是非常好奇啊。由于我是本地直接通过 [ rz ] 命令上传,结果发现一件非常神奇的事,有个文件我竟然删不掉,蛤?总不会一直都存在服务器了吧?这可不行啊,那以后再遇到该命名的文件,不是越积越多,服务器要是内存容量大那就忽略不计,但是我看着就不爽,碍眼。 我要想办法解决它!哪怕是今晚不睡了,于是乎...如下是具体报错截图: 我现在唯一的心思就是绞尽脑汁把这个名为 review-web(2).zip 的压缩包给删掉。于是乎,一个小时过去了,皇天不负有心人,我共研究出两种解决方案,供小伙伴们参考...四、 解决方案🔥我是才发现 linux5.0 版本之后,命令是不能带有括号的,如若需要带括号便需要转译。如下是两种转义方式:**方式1:**只需在括号前后加上反斜杠[ \ ]。转义括号为可读。**方式2:**在括号的两端加上[ " " ],注意:这是英文输入法下的双引号哦。五、实例演示🔥演示方式1: 我直接输入[ review-web\( ],然后键盘摁[ Tab ]键,它会自动补全并找到上述的review-web(2).zip,这样就能选中带括号的目标文件了。 比如我目标是删除这个文件,那我就直接可以进行进行rm -rf + targetFile 命令进行删除了。演示方式2: 在你的目标文件中,在带括号的两边分别用""包裹起来。具体请看如下演示截图: 或者直接用双引号""包裹带括号的文件名,切记是英文输入法下的双引号哦。具体请看如下演示截图: 如上就是解决此报错的两种方案,如果你有更好的解决方案,欢迎评论区留言分享给bug菌呀,一起学习才能变得更强,懂得分享才能获得更多快乐,毕竟我一路写过来,其实也没有说要为了干啥,第一是为了记录自己的程序人生,二来是对自己以后的自己有个交代,自己做了哪些,这些都是完整的记录在博客之中,所以也很喜欢在博客平台记录自己解决问题的一些看法及一些解决措施,得之于你赠之与你。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥环境:jdk1.8 + springboot 2.3 + 阿里云centos7.6三、排错 🔥 git提交本地修改内容push到gitlab代码库时,竟然出现如下报错:remote: You are not allowed to push code to this project. 就很离谱啊,我能拉取,但是无法push,莫不是没给我操作权限?很怀疑啊,于是我自己借来root账户,进行一波侦查,因为我老大一直说他赋权限了,我表示很怀疑,他是不是记混了。四、解决方案🔥 首先我们来确定一下当前git账号是否拥有该项目的写入操作权限?如下是具体操作步骤:你们可以跟着步骤走,如果有小伙伴gitlab版本不同而导致列表展示不是一致的,那也差不多就是在项目中的项目信息栏目里。第一步:打开项目成员列表 找到在gitlab的对应项目,然后找到项目信息,鼠标悬浮项目信息会展示一个右侧菜单,我们点击成员。第二步:查看git用户的操作权限。 点击成员后,会打开一个成员列表页,项目成员中有一列。专门展示对应操作权限,即如下截图中的最大角色列。把对应的操作权限加上即可。 实际截图很明显可以看到该用户还是[ Guest ] 角色。顾名思义,就是访客角色,角色当中权限最低的一个,当然就没有编辑push代码等操作权限啦。 我们直接将其角色改成 [ Maintainers ]好了,除Owner外的最大角色,名为:项目维护者。这样再进行git push操作试试,查看是否还会报上述错。 经测试, push成功了。验证成功。五、gitlab角色科普🔥 再者,我们来温习一下,上述最大角色中所涉及到的五种角色,分别如下:Guest (访客)可操作权限:可以创建issue、发表评论。不可操作权限:不能读写版本库。Reporter(记者)可操作权限:可以克隆代码。(QA、PM可以赋予这个权限)不可操作权限:不能提交。Developer(开发者)可操作权限:可以克隆代码、开发、提交、push。(RD可以赋予这个权限)不可操作权限:不能进行读写版本库。Maintainers(维护者)可操作权限:可创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限。不可操作权限:不能读写版本库。Owner(所有者)可设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员。(开发组leader可以赋予这个权限)。其中,Gitlab中的组和项目又分三种访问权限:分别为:Private、Internal、Public。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥**环境:**navicat 11 + mysql5.6 + Windows11三、摘要 🔥如下是我在执行sql时完整报错截图: 当看到报错还挺纳闷的,我就使用了一下[ union ]操作符,咋还拼接有错了,又没有列参数不对,都是b.*,讲道理不是操作符的问题。仔细一看,报错代码1221。完整报错如右:1221 - Incorrect usage of UNION and ORDER BY四、 排错 🔥 看到此错,瞬间脑海中浮现了我大学时带我数据库的罗老师,他千叮咛万嘱咐,说在使用 【union】操作符时,第一是列数量,第二是与 order by 联合使用...还有啥来着,我给忘了,但是此报错真是第二点造就的,因为【union】在没有括号的情况下只能使用一个order by,所以对于上述例子,如果你也是使用union但是使用了多个 order by,那么石锤你也遇到跟我一样的bug了。 所以,针对该问题,我有两种解决思路,仅供参考哈。五、解决方案 🔥思路1: 由于order by不能直接出现在union的子句中,但是可以出现在子句的子句中。所以我们将结果进行子集,分别再用一层select * 查询。切记要给定一下子集命名。如下是具体sql执行及执行结果。明显是可以看到排序生效了。思路2: 虽然该方式不是很推荐,但是也是一种解决方案,与方案一类似,但是就是将查询结果用括号括起,但有一点虽然不报错,但是排序字段不生效。 所以要想在排序字段生效,那就得使用order by的同时搭配limit 使用,,这样order by排序才会对单独每个子集进行排序处理,否则虽然不加也不会报错,但是排序字段是不起效果的,这点我是亲测已做验证,大家放心使用,但选择此方案也得大概明知查询子集数量最大不会超过多少的前提下,比如我设置100,明显是知道不可能会有100条数据的。 所以针对上述两种方案,依据你们的业务定,我在这推荐使用方案一,明显可拓展性比方案二要好,具体如何抉择,就看你们自己的啦,我也是将可解性都给大家诺列啦。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、前言🔥**环境:**jdk1.8 + springboot 2.3 + 阿里云centos7.6三、摘要 🔥java.net.SocketTimeoutException: connect timed out报错完整截图:这是我查看本地nohup日志所截图。访问swagger在线接口文档也是,500?四、排错 🔥 无奈至极,前端还急着要接口文档,我这咋部署失败了,虽然是项目第一次部署,但是我拍着胸膛说半分钟搞定,这眼瞅着一分钟都要过去了。 情急之下,我尝试了一个大胆的举动,我怀疑是不是服务器防火墙开启的缘故,因为我查看了8889项目启动端口之前是有配置过的, 因为刚开始开通阿里云服务器就统计了端口配置,我便配置了8889端口,所以我把怀疑的苗头指向了防火墙。 于是我 telnet 测试一下映射端口和远程访问主机,果然连接不上。 然后本机也测试连接了一下,也是连不上; 我们都知道阿里云它有外部防火墙跟内部防火墙。外部防火墙,我是已经自定义端口了。如果你不会,你也用的是阿里云服务器,那你进入阿里云控制台,找到配置规则,点击一下会出现有防火墙规则设置的,然后添加规则就行。 所以,我尝试了下,把内外防火墙都给关了,果不其然,8889端口可以访问上了。如下是关闭防火墙再测试连接截图:五、解决方案🔥 所以如果你遇到此问题,你开启指定端口或者直接关闭防火墙后就行了!就这么简单,不行都试试。但是不建议这么做啊,毕竟服务器容易被黑,被注入挖矿,哇咔咔。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出七、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️一、环境说明🔥环境:jdk1.8 +mysql 5.6 + 阿里云centos7.6二、报错内容 🔥报错完整截图:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure三、报错排查 🔥 很离谱,我本地开发与线上测试环境共用一个数据库,上一秒还在本地开发好好的,为何打了个jar包,运行也就报数据库通讯连接故障。我仔细核对了数据库连接等配置信息,与本地完全一致,然后也排查了本地与线上ip及端口,都是能访问的。navicat连接也正常。讲道理,不可能存在问题啊,但是拒绝访问,百思不得其解。 我再把该jar在本地运行,也是正常的。 然后我脑洞突然清奇了一下,该不会是该数据库没有开启远程连接吧?虽然我使用的该服务器ip加端口号,但是数据库如果未开通远程连接,ip它是不认的,只认localhost 与 127.0.0.1,这时我才反应过来,于是我立马去查看了现有用户,密码及允许连接的主机,果不其然,Host对应的就只有localhost 与 127.0.0.1这两,难怪我用ip访问不上。大家可以参考文末的附录。四、解决方案 🔥 将ip改成localhost,但这只适用于mysql服务与你部署的后端服务在一台云主机上才行。要不然改成localhost 也于事无补。 再重新执行启动命令启动一下。 看到了控制台打印秒数,我就知道,报错果然是ip的问题,虽然不是很难被发现,排查一下问题也容易发现问题点,但是如果你看了我写的,我相信你能在第一时间定位问题并解决问题,这就是看了这篇文章能带给你的东西。五、附录🔥 这里多设置了一行host为%。%这里表示的是允许任意host访问。但一般不建议这么设置奥,比较危险,谨慎操作。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~七、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出八、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥**环境版本:**centos7.6 + redis6.2.6 + xshell 5三、排错🔥 通过xshell5远程连接阿里云服务器,内核是centos7.6版本。然后项目需要用到redis就因此安排了另外一位同事在云主机上安装了一台redis。正当我在写登录接口时,就想起得上redis连接客户端进行查看一番我的token是否精准被写入,却发现,噢哟?连接不上了?如下是具体报错:(error) NOAUTH Authentication required.报错中译过来的意思就是:需要进行登录认证。登录认证?四、解决方案🔥 简而言之就是redis设置了登录密码,你没填写密码自然就提示你要登录校验咯。你只需要输入一下redis的登录密码即可。如下是输入redis密码命令:供cv。auth redisPassWord 如上截图提示ok,便说明密码正确登录成功了。 如果输入错误密码则会提示你密码错误或者登录用户不存在。具体请看如下截图。五、redis常用命令🔥1、查看redis版本信息redis-server -v 2、redis连接先进到redis的解压文件夹下。cd redis-stable再进行客户端命令连接:redis-cli如果有 设置密码,则 输入下密码进行认证 即可。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~六、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出六、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境说明🔥**环境:**idea2019.3 + springboot 2.3三、排错🔥 新项目正如火如荼的开垦,待我梳理完创建好所有的业务表进行代码自动实体等控制时却报错了,生成失败,我是使用了MyBatis-Plus 提供的代码生成器AutoGenerator()类。具体报错如下截图: 这不难发现,提示到你了一个关键词[ freemarker ],所以这就是突破点,很明显是缺少相关依赖。四、解决方案🔥 首先检查你的项目依赖 pom.xml 中是否有引入freemarker 依赖包,没有进行引入一波,如果存在,则进行版本升级。 按如上方式,此报错便得以解决,排查到原因是因为代码生成器使用到了freemarker 的静态模板,你若缺少配置,自然是不可能进行常规文件模板的生成,所以我们只需要配置该依赖到项目中,就好啦。如下是 freemarker 的依赖配置,加到项目的pom.xml里即可。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 将此依赖注入进去,然后重新启动你的项目就可以了。如上是我亲测所为,如果你还遇到什么问题,欢迎评论区下留言告诉我,我会第一时间给与你解决,我为人人,人人为我。... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~五、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出六、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、环境🔥**环境:**centos7.6 + mysql 5.6 + navicat11三、排错🔥我在使用 navicat 进行mysql数据库表结构编辑后点击保存时,直接弹窗提示报错:1075-Incorrect table definition;there can be only one auto column and it must be defined as a key报错完整截图:中译过来的意思就是: 表定义不正确;只能有一个自动列,并且必须将其定义为主键 。这报错,明显一看就是你建表中含有字段设置了自增但它不是主键。四、解决方案🔥 所以很好解决啊,顺着自增这点出发,像时间、字符串等类型都是不能设置自增项的,直接检查你表中字段类型为数字类型的;重点排查 int / bigint 这两类型,毕竟最为常用。 找到该字段,然后去掉自动递增即可。我是误操作将status字段设置了[ 自动递增 ],才导致无法保存且报mysql1075异常。所以,我给大家总结了以下两点,在建表的时候务必要记住:如果表中设置了一个字段为自增,那么这个字段也必须要设置成主键。如果需要设置多个主键,其中只能有一个是自增的。 我就是踩坑啦,虽然一看报错就知道该为何报错,报错及解决方案,那是因为我之前也看过类似的文章啦,所以我凭借印象,这也就是为啥我也要总结成文,记录下来,一来为自己增强记忆,二来帮助大家记忆,这样日后的你们如果遇到同样该错,那就能省去查资料的时间啦,上手就来。虽然不是很高大上知识点,但知识都是日积月累沉淀下来的。 ... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~五、往期推荐:如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。如何在swagger2中配置header请求头等参数信息?(若不会,我便手把手教你)Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出六、文末: 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言🔥👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、背景🔥 说起swagger,很多小伙伴肯定都对swagger都并不陌生,一个超级好用的集成在项目里的postman,但对于一般接口测试来说,是非常简便的。 常规都是body参数体,别的也不会用到。然而,对于一些非"常"操作,就显得不是那么的熟悉使用了,但是基本了解了它所提供的api,你也能改它的源码,但是我今天要说的是既不要你熟悉它的的实现源码也不用额外学习其他技术,只需要看我写的,我就能教懂你今天的主题,"如何给swagger请求时能附带自定义的请求头?"。 这个需求很常见吧,比如你的登录,如果是用token认证,那肯定会做的一件事就是每一次http请求都会要求前端在请求时请求头附带token令牌,对不对,这也是业务系统常用的登录拦截功能。今天我就拿这个例子来说,具体如何写,非常之简单。三、解决方案🔥 集成过swagger 的小伙伴,肯定都会在自己的项目中配置一下SwaggerConfig.java,缺它,你的swagger也运行不了,对吧。 那么跟swagger添加自定义请求头有啥联系?别着急,继续往下看。 我们都知道,body参数是自带的,要如果要添加header参数呢?那就要你手动添加啦,你只需要在注入该globalOperationParameters(),这是一个全局参数配置,你只需要将你设置的header 参数名设置进去即可。我们先来看下 globalOperationParameters() 方法加在哪里。/** * swagger文档配置 */ @Bean public Docket customDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.example.review.controller")) .paths(PathSelectors.any()) .build() .globalOperationParameters();// 全局配置 } 接着你既可以在当前类中把你要设置的header参数传进去,我是单独封装了一个添加参数的内置方法,这样好处就是代码不会造成过长。/** * 添加head参数配置 */ private List<Parameter> getParameterList() { ParameterBuilder clientIdTicket = new ParameterBuilder(); List<Parameter> pars = new ArrayList<Parameter>(); clientIdTicket.name(Constant.TOKEN_HERDER_KEY).description("token令牌") .modelRef(new ModelRef("string")) .parameterType("header") .required(false).build(); //设置false,表示clientId参数 非必填,可传可不传! pars.add(clientIdTicket.build()); return pars; } 假如你要添加多个header 请求头参数,那你就再new 一个 ParameterBuilder()类,然后一样的设置,在pars集合中将你参数build后add进去即可。Constant是我定义的一个常量类,这个你们若是不习惯直接定义字符串命名也可。最后一步就是将此刻封装的header 头传入到全局配置方法中。.globalOperationParameters(this.getParameterList()); 大家能看的明白不?若不能,我再把swagger配置全部粘贴到下边,大家好好的连串解读一下,基本看完我说的,你们下一次若是遇到再header添加自定义请求头的话,直接怼它,这我未出生就会了。如下是完整swagger 配置。package com.example.review.config; import com.example.review.util.Constant; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; import java.util.List; /** * swagger配置 * * @Author * @Date 2021-06-01 13:00 */ @Configuration //必须存在 @EnableSwagger2 //必须存在 public class SwaggerConfig { /** * swagger文档配置 */ @Bean public Docket customDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.example.review.controller")) .paths(PathSelectors.any()) .build() .globalOperationParameters(this.getParameterList());// 全局配置 } /** * 添加head参数配置 */ private List<Parameter> getParameterList() { ParameterBuilder clientIdTicket = new ParameterBuilder(); List<Parameter> pars = new ArrayList<Parameter>(); clientIdTicket.name(Constant.TOKEN_HERDER_KEY).description("token令牌") .modelRef(new ModelRef("string")) .parameterType("header") .required(false).build(); //设置false,表示clientId参数 非必填,可传可不传! pars.add(clientIdTicket.build()); return pars; } /** * api相关配置 */ private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("swagger 接口文档") .contact(new Contact("review", "", "")) .description("swagger-bootstrap-ui") .termsOfServiceUrl("http://localhost:8888/") .version("1.0") .build(); } }四、测试🔥配置后,重启下项目刷新一下swagger 访问链接。诺,这不加的header类型就出来了么。是不是很简单,直接配置也就不需要所有人都跑去postman进行接口测试了。 ... ... ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~五、往期推荐🔥如何使用Mybatis-plus实现字段内容的自动填充?不会我就教你。Springboot系列(十六):集成easypoi实现word模板内循环导出多数据Springboot系列(十六):集成easypoi实现word模板图片导出Springboot系列(十六):集成easypoi实现excel多sheet表导入Springboot系列(十六):集成easypoi实现excel多sheet表导出六、文末🔥 如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《SpringBoot零基础入门》,从无到有,从零到一!希望能帮到大家。 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
一、前言👨🎓作者:bug菌✏️博客:CSDN、掘金等💌公众号:猿圈奇妙屋🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。 哈喽,小伙伴们,我是bug菌呀👀。金三银四,又到了刷题月啦。所以不管你是准备跳槽还是在职,都一起行动起来,顺应这个时代月干点该干的事儿👣。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始➕🧈。 小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,掘金不停💕,加油☘️二、题目描述:题目:给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。具体请看如下示例:示例 1:输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows = 1 输出: [[1]]提示:1 <= numRows <= 30题目来源:LeetCode官网题目难度:⭐⭐三、思路分析: 这题就很经典啦,曾记否大学java课本上就有讲解这道题,当时还布置这题的变种题给我们作为课后作业,如上题就是等边形状杨辉三角,还有一种就是直角形状杨辉三角。根据如上动画找规律,传统解法就是根据规律来解题。每一行的开始和结尾数字都为1。第n+1行的第i个数字等于第n行的i-1个数字加上第 n 行的i个数字。用二维数组表示就是 a[i+1][j]=a[i][j-1]+a[i][j]根据上述两点规律,已经给你分析的明明白白,你难道还会解不出这道题么,你只需要根据我上方梳理的两点规律书写成代码即可。四、算法实现:AC代码具体算法代码实现如下:class Solution { public List<List<Integer>> generate(int numRows) { //定义一个二维集合。 List<List<Integer>> ret = new ArrayList<List<Integer>>(); for (int i = 0; i < numRows; i++) { //内置集合 List<Integer> row = new ArrayList<Integer>(); //由于只是给杨辉三角内的位置赋值,所以是j<=i for (int j = 0; j <= i; j++) { //根据规律,使用if else 赋值 //头尾都是1 if (j == 0 || j == i) { row.add(1); } else { row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j)); } } ret.add(row); } return ret; } }五、总结:leetcode提交运行结果截图如下:复杂度分析:时间复杂度:O(numRows^2)。空间复杂度:O(1)。不考虑返回值的空间占用。 综上,这题是不是很简单啊,遇到按图打印题,最重要的就是你能不能找到图的规律,如上这道就是在找规律,也称数学法解题。 再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。 好啦,以上就是本期的所有内容啦,咱们下期见咯。六、往期推荐:leetcode-1.两数之和leetcode-9.回文数leetcode-13.罗马数字转整数leetcode-14.最长公共前缀leetcode-20.有效的括号leetcode-21.合并两个有序链表leetcode-26.删除有序数组中的重复项七、文末: 如果你还想要学习更多,小伙伴们大可关注bug菌专门为大家创建的专栏《LeetCode每日一题》!带着你一块儿刷题,专栏每一篇都附带详细解法,手把手带你解题。 一个人刷可能会觉得很累很难坚持,但是一群人刷就会觉得它是一件很有意义的事儿,互相督促互相鼓励,一起变强。
题号:122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2:输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。题意解读:从第一天到最后一天,不错过每一次隔天的上涨每次买完股票,第二天就出售掉只要明天股票价格比今天高,今天就买入买入和出售可以发生在同一天解题思路:对比后一天的价格,高于前一天价格,就卖出,当天买入//贪心算法 func maxProfit(prices []int) int { // 设置当前收益为0 var max = 0 //假设从第二天开始买入, for i := 1; i <= len(prices); i++ { //当天价格高于前一天,就卖掉 if prices[i] > prices[i-1] { max += prices[i] - prices[i-1] } } return max } 拓展: “贪心算法” 在每一步总是做出在当前看来最好的选择。因此:“贪心算法” 和 “动态规划”、“回溯搜索” 算法一样,完成一件事情,是分步决策的;“贪心算法” 在每一步总是做出在当前看来最好的选择,我是这样理解 “最好” 这两个字的意思:“最好” 的意思往往根据题目而来,可能是 “最小”,也可能是 “最大”;贪心算法和动态规划相比,它既不看前面(也就是说它不需要从前面的状态转移过来),也不看后面(无后效性,后面的选择不会对前面的选择有影响),因此贪心算法时间复杂度一般是线性的,空间复杂度是常数级别的。这道题 “贪心” 的地方在于,对于 “今天的股价 - 昨天的股价”,得到的结果有 3 种可能:(1)正数(2)0(3)负数。贪心算法的决策是:只加正数。
题号:剑指 Offer 03. 数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。划重点:只需要找到一个重复值即可满足题意示例 1:输入: [2, 3, 1, 0, 2, 5, 3] 输出: 2 或 3 解题思路:1、暴力破解:双循环挨个挨个寻找,有没有重复值,有直接return即可2、排序法:先使用sort排序,再遍历查找3、map存法:遍历往map中存,每次存先判断是否存在相同的key,存在即return//超出时间限制 func findRepeatNumber(nums []int) int { //1、双遍历,找重复值 for i := 0; i < len(nums); i++ { for j := i + 1; j < len(nums); j++ { if nums[i] == nums[j] { return nums[i] } } } return -1 }func findRepeatNumber(nums []int) int { //先排序 sort.Ints(nums) for i:=1;i<len(nums);i++{ if nums[i] == nums[i-1]{ return nums[i] } } return -1 }//3、存map func findRepeatNumber(nums []int) int { var mapV = make(map[int]int) for i := 0; i < len(nums); i++ { _,ok:=mapV[nums[i]] if ok { return nums[i] }else{ mapV[nums[i]] = 1 } } return -1 } 往期回顾:【1】LeetCode-169. 多数元素(Goland实现) 【2】LeetCode-283. 移动零(Goland实现) 【3】LeetCode-38. 外观数列(Goland实现)
说明: 1、Windows10系统, 2、我本地gopath路径:D:\go_code1、安装govendorgo get -u github.com/kardianos/govendor注意:安装后govendor可执行文件将生成在你GOPATH/bin目录下; 2、govendor初始化cd [your dir] govendor init初始化成功如下:会生成一个vendor.json,自动忽略上面这几个文件夹,那是执行了步骤4完了之后会将这些所需要用到的依赖导进来的,你们只需看会生成一个空的vendor.json 文件即表示初始化成功 注意:你也可以配置vendor.json文件,比如编辑“ignore”字段来忽略掉某些目录下的包(这些包将不会加到vendor目录下),例如:{ "comment": "", "ignore": "test github.com/xxx/", "package": [], "rootPath": "safeboxManager" }这里将test包和github.com/xxx/目录下的所有包忽略。注意,如果改成"github.com/xxx"则只有"github.com/xxx"包被忽略。3、将下载项目中所有被用到的包go get ./...4、从GOPATH中添加依赖包到vendor目录govendor add +e然后发现vendor.json文件里加了很多依赖包的信息,同时vendor目录下把所需要的依赖包导进来了。OK,以上就是govendor安装的全过程了,如对上方有任何疑问或者存在不足的地方,欢迎下方留言或者加群咩。推荐:1、bash:govendor:command not found 如何解决?
问题如下:发现安装完govendor后,也确实在bin目录下生成了govendor.exe,确保govendor是安装成功了 ,可为啥使用 govendor 命令会找不到呢,结果原因出在这里;发现自己 gopath 没有映射到bin上,所以全局找不到该变量;解决办法:****就是在path变量上,加上gopath/bin的映射路径%GOPATH%\bin 复制代码 来看看效果吧,这不就好了嘛
1、string转成int:int, err := strconv.Atoi(string) 2、string转成int64:int64, err := strconv.ParseInt(string, 10, 64)3、int转成string:string := strconv.Itoa(int) 4、int64转成string:string := strconv.FormatInt(int64,10) 5、int转int64int64_ := int64(int) 6、string 转floatfloat, err := strconv.ParseFloat(string, 64)float, err := strconv.ParseFloat(string, 32)
c := db.Get() intoList := make([]*pa.Package, 0) err := db.GetEngine().Where("package_status=?", "0").And("package_id<>?", "0").Cols("package_id", "package_name").Find(&intoList) data, _ := json.Marshal(intoList) _, err = c.Do("SET", "package", data) if err != nil { fmt.Println(err) } t_data, err := redis.Bytes(c.Do("GET", "package")) if t_data == nil || len(t_data) <= 0 { fmt.Println("check erroor") return } var outList []*pa.Package err = json.Unmarshal(t_data, &outList) for _, v := range outList { fmt.Printf("%+v\n", *v) }控制台打印:redis 存入
cc := RewardInfo{ Id: 1, Name: "张三", } var dd RewardInfo dd.Id = 2 dd.Name = "李四" var intempList, outtempList []*RewardInfo intempList = append(intempList, &cc, &dd) //输出: 拓展: go append 函数常见操作1. 将切片 b 的元素追加到切片 a 之后: a = append(a, b...)2. 复制切片 a 的元素到新的切片 b 上:1. b = make([]T, len(a))2. copy(b, a)3. 删除位于索引 i 的元素:a = append(a[:i], a[i+1:]...)4. 切除切片 a 中从索引 i 至 j 位置的元素: a = append(a[:i], a[j:]...)5. 为切片 a 扩展 j 个元素长度: a = append(a, make([]T, j)...)6. 在索引 i 的位置插入元素 x: a = append(a[:i], append([]T{x}, a[i:]...)...)7. 在索引 i 的位置插入长度为 j 的新切片: a = append(a[:i], append(make([]T, j), a[i:]...)...)8. 在索引 i 的位置插入切片 b 的所有元素: a = append(a[:i], append(b, a[i:]...)...)9. 取出位于切片 a 最末尾的元素 x: x, a = a[len(a)-1], a[:len(a)-1]10. 将元素 x 追加到切片 a: a = append(a, x)
问题描述: 生产环境redis 查询出错,排查原因才发现,在做login记录缓存到redis,发现有两处地方,set key 时同名了,导致在get key 获取 导致出错! 如下,你在“GET”只是对“SET” 为String 类型的key获取,而“Lists”类型 用“GET”获取,就会出现 WRONGTYPE Operation against a key holding the wrong kind of value 这种报错方式问题定位:由于你 set 了一个Lists类型的 key ,而你在获取 时却用了非 Lists 的操作方法获取。db.Get().Do("SET", userId+"login",1)db.Get().Do("LPUSH", userId+"login",1) 不同数据类型对应不同的获取 value 方式,SET key ==》GET key ; LPUSH ==》LINDEX 等;
1、查看镜像来源docker search redis //查看可用版本2、获取 redis 镜像docker pull redis:latest // 拉取官方的最新版本的镜像ps: 不加版本号默认获取最新版本,指定安装后面带版本号,docker pull redis:4.0.93. 创建redis容器并启动执行命令如下:docker run -d --name redis-server -p 6379:6379 redis --requirepass "redis123" --appendonly yes命令解释说明:-d redis 表示后台启动redis。--name myredis 指定该容器名称,查看和进行操作都比较方便。-p 6379:6379 端口映射:前表示主机部分,后表示容器部分。--requirepass "redis123" redis登入密码。--appendonly yes 开启redis 持久化。(重启redis数据也不会丢失或丢失小部分)4、使用docker ps 查看redis已经运行了5、登进redis使用 docker exec -it redis /bin/bash进入redis 或者直接 docker exec -it redis 【+NAMES】 redis-clidocker exec -it redis /bin/bashdocker exec -it redis-server redis-cli6、测试连接redis-cli7、密码登入auth + password //auth redis1238、退登redisexit
Println:1. 用默认的类型格式显示方式将传入的参数写入到标准输出里面(即在终端中有显示), 2. 多个传入参数之间使用空格分隔, 3. 在显示的最后追加换行符, 4. 返回值为 写入标准输出的字节数和写入过程中遇到的问题。Printf:1. 用传入的格式化规则符将传入的变量写入到标准输出里面(即在终端中有显示), 2. 返回值为 写入标准输出的字节数和写入过程中遇到的问题。Sprintf:1. 用传入的格式化规则符将传入的变量格式化,(终端中不会有显示) 2. 返回为 格式化后的字符串。举个栗子:loginLog :="hhh|www" loginArray := strings.Split(fmt.Sprintf("%s", loginLog), "|") fmt.Println(fmt.Sprintf("这是:%s",loginLog)) //这是:hhh|www fmt.Print(loginArray[0]) //hhh
go中字符串和各种int类型之间的相互转换方式:1、string转成int:int, err := strconv.Atoi(string) 2、string转成int64:int64, err := strconv.ParseInt(string, 10, 64)3、int转成string:string := strconv.Itoa(int)4、int64转成string:string := strconv.FormatInt(int64,10)以备查询!
安装环境:系统:windows10 x64 ;GO语言:从安装包安装,使用最近新发布的1.14.2版本;IDE:IntelliJ IDEA第一步 :SDK下载和安装下载地址:golang.google.cn/dl/下载go1.14.2.windows-amd64 .msi文件后,打开点击安装,傻瓜式操作。 记下你安装sdk地址,一般默认安装在c盘根目录默认路径 C:\Go;第二步 :环境变量配置安装Go语言需要配置的环境变量有GOROOT、GOPATH和Path配置GOROOT Go语言安装目录配置GOPATH 允许多个目录。当有多个目录时,用英文分号 ; 进行分割,当有多个GOPATH时默认将go get获取的包存放在第一个目录下。手动建立GOPATH目录,我是在D盘根目录下面创建go_code文件目录、配置Path 作用是指定命令搜索路径检查是否有C:\Go\bin(你安装SDK下的bin路径),没有则手动点击编辑在最后一行添加上!(我的是安装时自动生成了);第三步:验证是否配置成功运行cmd,输入命令go env 并回车,查看信息与上面的配置相符即可;运行go version,查看安装的Go版本第四步:idea安装Go插件打开idea-》File--》Setting-->Plugins --> Browse repositories 2. 搜索Go ,然后选择Go,弹框右上角 install 即可。 在给IDEA 安装新插件之后,都需要重新启动IDEA ,以加载新的插件功能。第五步:idea创建Go项目1、当安装好了Go插件,重新启动IDEA之后选择新建项目工程,就可以在左边的导航栏中看到Go 项目的选项。 2、sdk选择刚安装的Go,直接next 3.选择你配置GOPATH 的路径存放项目,我是自定义Project名叫demo1 4、go项目就算基本创建好了,项目名:demo1 5、创建一个src-》main-》test.go文件,然后点击右上角的 Confiqure GOPATH ... 配置你本项目中的Gopath6、配置GOPATH 7、写个demo测试一下吧,嘿嘿8、成功输出,大功告成! 以上就是go的安装,环境配置,idea插件下载,及go项目创建的 全过程了,如有任何疑问或者有错误的地方,欢迎下方留言。精彩回顾:1、如何快速通过eclipse导入web项目及Tomcat 部署步骤【详细教程】
1、首先打开idea,左上角选择File--> Open..-->选择项目里的build.gradle文件-->Open as a project -->new window弹出以下框,默认即可,gradle这里可以使用3个选项之一,第三个是使用本机安装的gradle,设置jvm 与 jdk之后,就开始了自动java sysn点击ok完毕后,就会自动下载依赖,之后改动build.gradle,就像使用pom.xml时一样,更改保存即生效开始执行---------------------------------------------------------------------------------------------------------------------------------------如果遇到以下问题,说明你用的gradle版本 不兼容你当前项目所用的gradle版本,你可以查看下项目所用的gradle版本,再本地下载该gradle版本,然后配置Gradle home时候 选择该版本即可
Tikn是什么由Google的密码学家和安全工程师联合编写的加密库。源于与Google产品团队合作的丰富经验,提供了即便没有加密经验也可以安全使用的API。GitHub源码地址: github.com/google/tink通过官方demo我们可以知道Tink的使用方式。 maven配置方式导入依赖<dependency> <groupId>com.google.crypto.tink</groupId> <artifactId>tink</artifactId> <version>1.2.0</version> </dependency> gradle 配置方式导入依赖dependencies { compile("com.google.crypto.tink:tink:1.2.0") } demo演示:import com.google.crypto.tink.Aead; import com.google.crypto.tink.KeysetHandle; import com.google.crypto.tink.aead.AeadFactory; import com.google.crypto.tink.aead.AeadKeyTemplates; import com.google.crypto.tink.config.TinkConfig; import java.io.IOException; import java.security.GeneralSecurityException; public class TinkDemo { public static void main(String[] args) throws GeneralSecurityException, IOException { // 基于默认配置进行注册 TinkConfig.register(); // 测试用的明文字符串 String plaintext = "明文"; // 生成密钥 KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES256_CTR_HMAC_SHA256); // 使用密钥材料获取所选的基元的实例 Aead aead = AeadFactory.getPrimitive(keysetHandle); /* * 加密 * 第一个参数是plaintext(明文) * 第二个参数是associatedData(相关数据) * 可以为null,相当于一个空(零长度)字节数组。 * 同样,解密时必须提供同样的相关数据。 */ // 使用基元实例来完成加密任务 byte[] ciphertext = aead.encrypt(plaintext.getBytes(),null); // 解密 byte[] decrypted = aead.decrypt(ciphertext, null); System.out.println(new String(decrypted)); System.out.println(ciphertext); } } Tink 目前除了支持 java 外,还支持 Android、C++、Obj-C
java API1、replacereplace(char oldChar, char newChar) || replace(CharSequence , CharSequence )解释:replace 参数:char 或 CharSequence,即可以支持字符的替换,也支持字符串的替换;如下代码演示;String str = "AaBaBCc123"; System.out.println("str = "+str); String replace1 = str.replace("a", "A"); System.out.println("replace1 = "+replace1); String replace2 = str.replace('a','A'); System.out.println("replace2 = "+replace2); 复制代码输出结果:str = AaBaBCc123 replace1 = AABABCc123 replace2 = AABABCc123 复制代码2、replaceAllreplaceAll(String regex ,string)解释:replaceAll的参数是regex,即支持字符串替换也支持【正则表达式】匹配替换;如下代码演示String str = "AaBaBCc123"; System.out.println("str = "+str); String replace3 = str.replaceAll("a","A"); System.out.println("replace3 = "+replace3); String replace4 = str.replaceAll("\\d","D");// System.out.println("replace3 = "+replace4); 复制代码输出结果:str = AaBaBCc123 replace3 = AABABCc123 replace3 = AaBaBCcDDD 复制代码3、replaceFirst与replaceAll类似,只是replaceFirst 只能替换第一次出现的字符串(顺序:从左往右);代码演示如下String str = "AaBaBCc123"; System.out.println("str = "+str); String replace5 = str.replaceFirst("a","A"); System.out.println("replace5 = "+replace5); String replace6 = str.replaceFirst("\\d","A"); System.out.println("replace6 = "+replace6); 复制代码输入结果:str = AaBaBCc123 replace5 = AABaBCc123 replace6 = AaBaBCcA23 复制代码扩展1、replace 、replaceAll 有何区别?相同点:都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串;不同点:replaceAll支持正则表达式,因此会对参数进行解析(两个参数均是),如replaceAll("\\d", "A"),而replace则不会,replace("\\d","A")就是替换"\\d"的字符串,而不会解析为正则表达式,另外 replaceAll 只能接受String型参数,而replace 还能接受char型参 。2、replaceAll 与 replaceFirst 区别?相同点:既支持正则表达式匹配替换也支持字符串替换不同点:replaceAll 能替换所有,而replaceFirst 只能替换第一次出现的字符串3、“ \ ” 的用法在java字符常量中,反斜杠(\)是一个特殊的字符,被称为转义字符,它的作用是用来转义后面一个字符。转义后的字符通常用于表示一个不可见的字符或具有特殊含义的字符,例如换行(\n)。所以:在字符串中表示 \ 时应转义成 \\ ,要用两个 " \ " 代表一个;
解决思路:修改hosts文件: 选用记事本打开 该路径下 【C:\Windows\System32\drivers\etc 】的hosts 文件在最后一行中加入:0.0.0.0 account.jetbrains.com 复制代码随后重启idea即可;
数据库通常分为层次式数据库、网络式数据库和关系式数据库三种。而不同的数据库是按不同的数据结构来联系和组织的。在当今的互联网中,最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库。列举如下常见的数据库关系型数据库:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL非关系型数据库:NoSql、Cloudant、MongoDb、redis、HBase二者具体区别:可参考这篇:www.cnblogs.com/zhuifeng-ma…以上作为拓展,回归正题,以下将介绍下JDBC建立连接常见的关系型数据库的URL及driver的格式URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,postgre jdbc支持的URL的写法为:JDBC的URL=协议名+子协议名+数据源名。 a .协议名总是“jdbc”。 b .子协议名由JDBC驱动程序的编写者决定。 c .数据源名也可能包含用户与口令等信息;这些信息也可单独提供。 介绍:几种常见的数据库连接RDBMSJDBC驱动程序名称URL格式默认端口举例oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@dbip:port:databasename1521jdbc:oracle:thin:@10.10.10.10:1521:dataBasemysqlcom.mysql.jdbc.Driverjdbc:mysql://dbip:port/databasename3306jdbc:mysql://10.10.10.10:3306/dataBaseSQLServercom.microsoft.jdbc.sqlserver.SQLServerDriver jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename1433jdbc:sqlserver://10.10.10.10:1433;DatabaseName=dataBaseDB2com.ibm.db2.jdbc.app.DB2Driver jdbc:db2://dbip:port/databasename5000jdbc:db2://10.10.10.10:5000/dataBasePostgreSQLorg.postgresql.Driverjdbc:postgresql://dbip:port/databasename5432jdbc:postgresql://10.10.10.10:5432/postgresSybasecom.sybase.jdbc4.jdbc.SybDriverjdbc:sybase:Tds:dbip:port/databasename5000jdbc:sybase:Tds:192.168.2.103:5000/SXABC达梦dm.jdbc.driver.DmDriverjdbc:dm://dbip:port/databasename5236jdbc:dm://localhost:5236/hive注: 比如jdbc:表示采用jdbc方式连接数据库oracle:表示连接的是oracle数据库thin:表示连接时采用的是thin模式(thin和oci)jdbc:oracle:thin:是一个jni方式的命名dbip:数据库所在的机器的名称,如果是本机则为127.0.0.1或者是localhost,如果是远程连接,则是远程的机器IP地址; port:端口号databasename :数据库名以下总结出常见的几种数据库默认端口号:关系型数据库Oracle --- 1521MySQL --- 3306SQL Server --- 1433Sybase --- 5000DB2 --- 5000PostgreSQL --- 5432NOSQL数据库MongoDB --- 27017Redis --- 6379Memcached --- 11211附上:如何本地修改SQL Server 2017数据库默认端口
第一步:点击电脑桌面左下角的开始菜单,选择“SQL Server 2017配置管理器”打开。第二步:如下图步骤2处,双击”TCP/IP“协议名称,会弹出协议、IP地址的选项卡,切换到“IP地址”选项。修改tcp端口 ,最后5步骤后点击应用;第三步、返回SQL Server配置管理器的主界面,在左侧菜单中,选择“SQL Server服务”,在右侧显示框中选择“SQL Server(MSSQLSERVER)”,在右键菜单中选择“重新启动”。至此,完成修改SQL Server 2017数据库默认端口。如下图参考1:安装 SqlServer 2017教程 参考2:windows10彻底卸载sql server 2017
由于在Java中小数点是一个特殊符号,是对象调用属性和方法的特殊符号,所以编译会出错的,用 \\ 是把小数点转义成单纯的小数点。注意:在字符串中表示 \ 时应转义 \\使用split分割小数点的时候,要对小数点进行转义,代码如下:public static void main(String[] args) { String name = "app.class"; String split1 = name.split("\\.")[0]; //注意是双左斜杠转义 String split2 = name.split("\\.")[1]; String[] splitArray = name.split("\\."); System.out.println("split1="+split1+",split2="+split2); System.out.println("splitArray[0]="+splitArray[0]+",splitArray[1]="+splitArray[1]); } 控制台打印:split1=app,split2=class splitArray[0]=app,splitArray[1]=class split()方法是将指定字符串按某指定的分隔符进行拆分,拆分将会形成一个字符串的数组并返回;split("\.")[0] 是一种缩写形式,把它拆开来看实际就是,先用split("\.")方法将字符串以" . "开割形成一个字符串数组,然后再通过索引[0]取出所得数组中的第一个元素的值;如上方代码演示 name.split("\.")[0] , name.split("\.")[1] 根据打印结果,显然是分别取出分割开后字符串数组的第 0 位 与第 1 位;
QueryBuilder 是es中提供的一个查询接口private SearchResponse getApiResponseByDetail(SearchRequestBuilder responseBuilder,String condition) { String time1 = "2020-01-02T00:00:00.000Z"; String time2 = "2020-01-02T15:59:59.000Z"; RangeQueryBuilder rangequerybuilder = QueryBuilders //传入时间,目标格式2020-01-02T03:17:37.638Z .rangeQuery("@timestamp") .from(time1).to(time2); SearchResponse searchResponse = responseBuilder.setQuery( QueryBuilders.boolQuery() //must表示and .must(rangequerybuilder) //根据时间范围查询 .must(QueryBuilders.existsQuery("api_id")) .must(QueryBuilders.matchPhraseQuery("detail", condition)) ).setExplain(true).execute().actionGet(); return searchResponse; } 复制代码注意:es存储日志 是按照UTC时间格式存放,以@timestamp 作为时间范围查询条件,即from(Date1) to(Date2)Date1、Date2入参必须是标准的utc格式;本地时间转utc?不清楚的小伙伴可以看下这篇 java如何实现本地时间转成UTC时间格式?1、BoolQuery( ) 用于组合多个叶子或复合查询子句的默认查询must 相当于 与 & =must not 相当于 非 ~ !=should 相当于 或 | or filter 过滤boolQuery().must(termQuery("content", "test1")) .must(termQuery("content", "test4")) .mustNot(termQuery("content", "test2")) .should(termQuery("content", "test3")) .filter(termQuery("content", "test5")); 复制代码 2、Elasticsearch java api 常用查询方法QueryBuilder构造举例ps:以下来源:www.mamicode.com/info-detail…精确查询以下字段名用${fieldName}代替,具体值用${fieldValue}代替1、数字//单个 QueryBuilder qb1 = QueryBuilders.termQuery("${fieldName}", "${fieldValue}"); //批量 QueryBuilder qb1 = QueryBuilders.termsQuery("${fieldName}", "${fieldValues}"); 复制代码2、字符串//单个 QueryBuilder qb1 = QueryBuilders.termQuery("${fieldName}.keyword", "${fieldValue}"); //批量 QueryBuilder qb1 = QueryBuilders.termsQuery("${fieldName}.keyword", "${fieldValues}"); 复制代码模糊查询1、数字数字查询都为精确查询2、字符串QueryBuilder qb1 = QueryBuilders.moreLikeThisQuery(new String[]{"${fieldName}"}, new String[]{"${fieldValue}"}, null); 复制代码范围查询数字//闭区间查询 QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2}); //开区间查询 QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false); //大于 QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").gt(${fieldValue}); //大于等于 QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").gte(${fieldValue}); //小于 QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").lt(${fieldValue}); //小于等于 QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").lte(${fieldValue}); 复制代码多条件查询QueryBuilder qb1 = QueryBuilders.moreLikeThisQuery(new String[]{"${fieldName1}"}, new String[]{"${fieldValue1}"}, null); QueryBuilder qb2 = QueryBuilders.rangeQuery("${fieldName2}").gt("${fieldValue2}"); QueryBuilder qb3 = QueryBuilders.boolQuery().must(qb1).must(qb2);
先科普一下;时间标准简介UTC(世界标准时间)协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“TempsUniversel Coordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。GMT(格林尼治平时)格林尼治平时(又称格林尼治平均时间或格林尼治标准时间,旧译格林威治标准时间;英语:Greenwich MeanTime,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。CST(北京时间)北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。ps:以上出自 blog.csdn.net/top_code/ar…Date日期格式的各种转换,可参考:blog.csdn.net/qq_35893120… 需求: 最终目标是获取指定的UTC时间格式; // 目标格式:2020-01-02T03:17:37.638Z分析: 1、获取指定时间串,比如:获取昨日凌晨时间 2020-01-02 00:00:00 2、String转Date类型,用到了parse 比如:Thu Jan 02 00:00:00 CST 2020 3、然后是Date转UTC格式类型,用到了format 比如:2020-01-02T00:00:00Z代码实现:如下; 方法一:public static void main(String[] args) throws ParseException { Calendar cal=Calendar.getInstance(); cal.add(Calendar.DATE,-1);//这里改为-1 获取昨日时间 Date time=cal.getTime(); String format1 = new SimpleDateFormat("yyyy-MM-dd 00:00:00").format(time);//获取昨日00:00:00时间 String format2 = new SimpleDateFormat("yyyy-MM-dd 23:59:59").format(time);//获取昨日23:59:59时间 System.out.println("获取指定时间且指定格式的时间串,format="+format1); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date1 = sdf.parse(format1); Date date2 = sdf.parse(format2); System.out.println("将获取到时间串转Date类型,date="+date1); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); //由于我是指定时间转换,必不考虑utc+8 的时区差 String time1 = format.format(date1); String time2 = format.format(date2); //获取当前系统时间 UTC格式 String time3 = format.format(new Date()); System.out.println("输出指定utc格式:time="+time1); System.out.println("输出当前系统时间utc格式:time="+time3); } 复制代码控制台打印:获取指定时间且指定格式的时间串,format=2020-01-02 00:00:00 将获取到时间串转Date类型,date=Thu Jan 02 00:00:00 CST 2020 输出指定utc格式:time=2020-01-02T00:00:00Z 输出当前系统时间utc格式:time=2020-01-03T11:15:40Z 复制代码方式二:public static void main(String[] args) throws ParseException { String str="2020-01-02 23:59:59"; SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date =sdf.parse(str); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int zoneOffset = calendar.get(Calendar.ZONE_OFFSET); int dstOffset = calendar.get(Calendar.DST_OFFSET); calendar.add(Calendar.MILLISECOND, -(zoneOffset + dstOffset)); long timeInMillis = calendar.getTimeInMillis(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); System.out.println(df.format(timeInMillis)); } 复制代码 控制台打印:2020-01-02T15:59:59.000Z
• 删除一个已被终止的分支如果需要删除的分支不是当前正在打开的分支,使用branch -d直接删除git branch -d <branch_name> 复制代码• 删除一个正打开的分支如果我们在试图删除一个分支时自己还没转移到另外的分支上,Git就会给出一个警告,并拒绝该删除操作。如果坚持要删除该分支的话,就需要在命令中使用-D选项。git branch -D <branch_name> 复制代码• 恢复被删除的分支Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提交的指针,但该提交对象依然会留在版本库中。因此,如果我们知道删除分支时的散列值,就可以将某个删除的分支恢复过来。在已知提交的散列值的情况下恢复某个分支:git branch <branch_name> <hash_val> 复制代码如果我们不知道想要恢复的分支的散列值,可以用reflog命令将它找出来。如:reflog命令:显示整个本地仓储的commit,包括所有branch的commit,甚至包括已经撤销的commit。只要HEAD发生了变化, 就会在reflog里面看得到。这时恢复分支a_branch分支如下:git branch <branch_name> HEAD@{4} 复制代码ps:转载于:www.cnblogs.com/utank/p/788…
jdk自带有个jvisualvm工具、该工具是用来监控java运行程序的cpu、内存、线程等的使用情况。并且使用图表的方式监控java程序、还具有远程监控能力。不失为一个用来监控tomcat的好工具。主要有如下的功能: 1.监控本地Tomcat 2. 监控远程Tomcat 3.监控普通的JAVA进程 4、监控远程springboot服务【尝试过但是一直连接失败,报错如下: 无法使用 service:jmx:rmi:///jndi/rmi://111.11.11.111:10001/jmxrmi 连接到111.11.11.111:10001】 ...------------------------------------------------------------------------------------------------------------------------------------------如下就演示如何监控本地java程序1、本地jdk小工具的配置进入到本地的jdk安装目录下(默认位置:jdk文件夹中的bin路径下,C:\Program Files\Java\jdk1.8.0_162\bin),找到jvisualvm.exe,双击打开2、如图所示, 你可以看到本地所起的应用程序;3、图一显示本地core模块java程序内置服务器的整体运行状况;【本地为一个springboot 项目】 图一4、图二:可事实动态显示cpu、堆栈、类、线程的相关信息 图二5、图三:线程:可实时动态的显示进程的使用状况 图三6、图四:点击线程Dump按钮可以显示具体的进程的内容,可从此页面查看到进程的具体信息以及报错信息 图四------------------------------------------------------------------------------------------------------------------------------------------拓展:使用jvisualvm来远程监控tomcat1、右键点击远程-添加远程主机-输入主机ip地址;2、添加远程主机之后,点击远程主机右键-添加jmx连接: 3、弹出登录框 输入主机名:端口号,如果配置了用户名和密码,请输入用户名和密码。然后点击确定。点击确定之后、在远程主机下会有一个jmx连接,打开连接,点击监视tab,可以看到如下界面了。ps:此上我正常走流程下来,确认操作可行,但是如下问题,我点击完确定后,一直无法连接服务器,尝试了很多办法,暂时都没解决,报错内容如下:无法使用 service:jmx:rmi:///jndi/rmi://111.11.11.111:10001/jmxrmi 连接到111.11.11.111:10001,如有大佬会此问题,请多多赐教,下方留下您宝贵的解决办法或者建议吧,Thanks♪(・ω・)ノ
一:通过js获取先定义一个CheckBox:html:<input type="checkbox" name="test" value="1"/><span>1</span> <input type="checkbox" name="test" value="2"/><span>2</span> <input type="checkbox" name="test" value="3"/><span>3</span> <input type="checkbox" name="test" value="4"/><span>4</span> <input type="checkbox" name="test" value="5"/><span>5</span> <input type='button' value='提交' onclick="show()"/>js:function show(){ obj = document.getElementsByName("test"); check_val = []; for(k in obj){ if(obj[k].checked) check_val.push(obj[k].value); } alert(check_val); }演示:二:vue页面如何获取:直接通过给每个选项添加一个v-model 双向绑定即可:<div id="d5"> <p>{{box5.toString()}}</p> <input type="checkbox" v-model="box5" value="red"> <input type="checkbox" v-model="box5" value="黄"> <input type="checkbox" v-model="box5" value="蓝"> </div> <script> new Vue({ el:'#d5', data:{ box5:[] } }) </script> 演示: 三:vue页面,通过watch监控所被选中的选项, {{item.text}} export default { name:'checkbox', data(){ return { checkedValue:[],//一定必须是数组不能是字符串 answer:[], } }, watch:{ checkedValue:function(new_v,old_v){ this.answer=this.checkedValue; } }, }
由于项目部署在服务器上,异常终止,打印log日志才发现,堆内存溢出,所以为了具体了解并解决这个问题,借此本地模拟堆内存溢出,得到堆内存hprof文件,可用工具具体分析。1、本项目为一个springboot项目,修改项目启动模块,如下图,VM options 中添加-Xms60m-Xmx60m-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=C:\Users\luoyong\Desktop\error //hprof文件 存放位置不到一会儿,由于堆内存太小,导致没有足够的内存,项目异常终止;java.lang.OutOfMemoryError: GC overhead limit exceeded,即内存溢出,主要是因为需求资源超出JVM的可用资源,导致报错。报错原因在很多情况下都会出现java.lang.OutOfMemoryError报错,具体原因通过资料得知,主要有以下两种:外因:程序的内存太大(比如class文件太多、lib下的jar文件太多等等)或者逻辑有误,导致程序的运行内存过大,超出限制。内因:内因多是由于wildfly的启动参数造成的,比如JVM的初始内存、JVM的最大内存等问题。ps:此处出自:blog.csdn.net/xiazaixm/ar…当有OutOfMemory异常出现的时候,JVM就会将当前的虚拟机的堆等信息放入hprof文件中,名字是大概java_pid加上进程号,比如:java_pid17712.hprof (可分析文件) 我们可以进行以下两种方式分析:#1 通过jdk自带的内存分析工具JVisualVM java_pid17712.hprof详击:jdk自带监控程序-jvisualvm使用介绍#2 通过一个基于Eclipse的内存分析工具 Eclipse Memory Analyzer —— MAT详击:MAT内存分析工具-独立版
P3c是阿里代码规范检查工具,该插件由阿里巴巴 P3C 项目组研发。代码已经开源,GitHub:github.com/alibaba/p3c阿里介绍文章:mp.weixin.qq.com/s/IbibsXlWH…该插件已支持了IDEA、Eclipse,在扫描代码后,将不符合规约的代码显示出来,甚至在 IDEA 上,还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在,还实现了批量一键修复的功能。【支持版本】IDEA官方仓库:最低支持版本14.1.7,JDK1.7+Eclipse版插件:支持4.2(Juno,JDK1.8+)及以上版本【检测更新】可以通过 Help >> Check for Udates 进行插件新版检测 或者直接到安装该Alibaba Java Coding Guidelines 的那个窗口,直接点击upload(下图2处)【图1】 【插件卸载】在插件面板点击"uninstall"即可。------------------------------------------------------------------------------------------------------------------------------------------【基于IDEA 环境,简易安装教程】打开 IDEA,选择 File -> Settings -> Plugins -> Browse repositories 后,输入搜索 alibaba 选中 Alibaba Java Coding Guidelines;点击插件详情中的"install"按钮,按照其提示即可完成安装,安装完成后需重启IDEA(由于我是已安装,即截图展示为可更新update);【图2】 【功能体验】安装后完成后,需要重启IDEA,重启后就可以在菜单栏中看到它的功能按钮一、选中整个项目右键会出现两个功能按钮,点击绿色的【 编码规约扫描 】,即可开始扫描全局代码,或者在工程目录上右键也会出现检测的功能按钮。二、如果不想全部扫描,只扫描某一文件夹下的所有文件或者单一文件的话,选中该目录或者单一文件右键也会出现此功能按钮,效果就是扫描出该文件所包含的bug或者不规范。三、其中部分不规范的代码,单击右键支持一键修复;【总结】代码规范检测,有助于我们进行代码排错、提高编码效率、以及提升项目整体的运行速度。--------------------------------------------------------------------------------------------------------------------------------------
篇一:blog.csdn.net/weixin_4397… 相信根据篇一步骤走,不差的都已经成功安装好了Nginx ,那好,接下来,将介绍一下Nginx最重要的配置说明,以及通过实例介绍通过Nginx如何实现反向代理;一个人可能走的更快,但是一群人会走的更远!你们说,对吗?一、nginx.conf 配置说明#user nobody;worker_processes 1; #工作进程:数目。根据硬件调整,通常等于cpu数量或者2倍cpu数量。#错误日志存放路径#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid; # nginx进程pid存放路径events {worker_connections 1024; # 工作进程的最大连接数量} http {include mime.types; #指定mime类型,由mime.type来定义default_type application/octet-stream;# 日志格式设置#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main; #用log_format指令设置日志格式后,需要用access_log来指定日志文件存放路径sendfile on; #指定nginx是否调用sendfile函数来输出文件,对于普通应用,必须设置on。如果用来进行下载等应用磁盘io重负载应用,可设着off,以平衡磁盘与网络io处理速度,降低系统uptime。#tcp_nopush on; #此选项允许或禁止使用socket的TCP_CORK的选项,此选项仅在sendfile的时候使用#keepalive_timeout 0; #keepalive超时时间keepalive_timeout 65;#gzip on; #开启gzip压缩服务#虚拟主机server {listen 80; #配置监听端口号server_name localhost; #配置访问域名,域名可以有多个,用空格隔开#charset koi8-r; #字符集设置#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#错误跳转页#error_page 404 /404.html; # redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。# root html; #根目录# fastcgi_pass 127.0.0.1:9000; #请求转向定义的服务器列表# fastcgi_index index.php; # 如果请求的Fastcgi_index URI是以 / 结束的, 该指令设置的文件会被附加到URI的后面并保存在变量$fastcig_script_name中# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl; #监听端口# server_name localhost; #域名# ssl_certificate cert.pem; #证书位置# ssl_certificate_key cert.key; #私钥位置# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; #密码加密方式# ssl_prefer_server_ciphers on; # ssl_prefer_server_ciphers on; ## location / {# root html;# index index.html index.htm;# }#}}标注:此处转载于 blog.csdn.net/qq_37345604… 二、拿我一处配置好的项目给大家介绍一下,使用域名访问本地项目。实际开发中,会有很多不同的环境,开发环境(本地环境)、测试环境(提供给测试人员用的环境)、预发布环境(数据是和生成环境的数据一致,运行最新的项目代码进去测试)、生产环境(项目最终发布上线的环境);如果不同环境使用不同的ip去访问,可能会出现一些问题。为了保证所有环境的一致,我们会在各种环境下都使用域名来访问。最终实现目标:本地web项目,通过指定的域名访问;三、域名解析一个域名一定会被解析为一个或多个ip。这一般会包含两步:本地域名解析: 浏览器会首先在本机的hosts文件中查找域名映射的IP地址,如果查找到就返回IP ,没找到则进行域名服务器解析,一般本地解析都会失败,因为默认这个文件是空的。- Windows下的hosts文件地址:C:/Windows/System32/drivers/etc/hosts- Linux下的hosts文件所在路径: /etc/hosts 域名服务器解析:本地解析失败,才会进行域名服务器解析,域名服务器就是网络中的一台计算机,里面记录了所有注册备案的域名和ip映射关系,一般只要域名是正确的,并且备案通过,一定能找到。四、解决域名解析问题我们不可能去购买一个域名,因此我们可以伪造本地的hosts文件,实现对域名的解析。修改本地的host为:```127.0.0.1 api.leyou.com127.0.0.1 manage.leyou.com```这样就实现了域名的关系映射了。五、通过域名访问: http://localhost:9001/#/login 重点:页面报错了 !Invalid Host header 原因:我们配置了项目访问的路径,虽然manage.leyou.com映射的ip也是127.0.0.1,但是webpack会验证host是否符合配置。所以,此处专有一篇介绍如何解决此问题---》blog.csdn.net/weixin_4397…六、nginx解决端口问题比如:http://localhost:9001/#/login(前) ---> manage.leyou.com/#/login(后)域名问题解决了,但是现在要访问后台页面,还得自己加上端口:`manage.leyou.com:9001/#/login`。这就不够优雅了。我们希望的是直接域名访问:`manage.leyou.com/#/login`。这种情况下端口默认是80,如何才能把请求转移到9001端口呢?这里就要用到反向代理工具:Nginx七、什么是Nginx?1、nginx可以作为web服务器,但更多的时候,我们把它作为网关,因为它具备网关必备的功能:- 反向代理- 负载均衡- 动态路由- 请求过滤2、nginx作为反向代理什么是反向代理?- 代理:通过客户机的配置,实现让一台服务器(代理服务器)代理客户机,客户的所有请求都交给代理服务器处理。- 反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器。nginx可以当做反向代理服务器来使用:- 我们需要提前在nginx中配置好反向代理的规则,不同的请求,交给不同的真实服务器处理- 当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能八、安装Nginx 此处跳过、篇一详细介绍blog.csdn.net/weixin_4397…九、反向代理配置```nginx#user nobody;worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; server { listen 80; server_name manage.leyou.com; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { proxy_pass http://127.0.0.1:9001; proxy_connect_timeout 600; proxy_read_timeout 600; } } server { listen 80; server_name api.leyou.com; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { proxy_pass http://127.0.0.1:10010; proxy_connect_timeout 600; proxy_read_timeout 600; } }解释一下:十、测试启动nginx,然后用域名访问后台管理系统:现在实现了域名访问网站了,中间的流程是怎样的呢?1. 浏览器准备发起请求,访问http://mamage.leyou.com,但需要进行域名解析2. 优先进行本地域名解析,因为我们修改了hosts,所以解析成功,得到地址:127.0.0.13. 请求被发往解析得到的ip,并且默认使用80端口:http://127.0.0.1:80本机的nginx一直监听80端口,因此捕获这个请求4. nginx中配置了反向代理规则,将manage.leyou.com代理到127.0.0.1:9001,因此请求被转发5. 后台系统的webpack server监听的端口是9001,得到请求并处理,完成后将响应返回到nginx6. nginx将得到的结果返回到浏览器最终展示流程:
所作皆为本怂亲力亲为,如有任何问题或者疑问,欢迎下方留言。一个人可能走的更快,但是一群人会走的更远!你们说,对吗?一、环境说明:Windows 10、centerOS 7.X二、安装Nginx、此例采用编译安装方式、亲测!!!1. 安装编译安装所需要的依赖yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel2、下载Nginxyum install -y wget wget https://nginx.org/download/nginx-1.14.0.tar.gz3. 解压tar zxf nginx-1.14.0.tar.gz cd nginx-1.14.04. 编译安装(默认设置)./configure make && make install5. 查看安装目录whereis nginx nginx: /usr/local/nginx6、启动Nginxcd /usr/local/nginx/sbin ./nginx //<!--重启服务--> ./nginx -s reload7. 查看Nginx是否运行ps -ef | grep -v grep | grep nginx 8. 查看Nginx默认监听端口9、编辑Nginx 配置文件:vi /usr/local/nginx/conf/nginx.conf注意:对于编译安装来说,任何对于Nginx配置文件的修改,如想使其生效,必须重载Nginx,使用以下命令:cd /usr/local/nginx/sbin ./nginx -s reload //处于sbin目录下执行reload即可10、安装完毕:删除 压缩包和安装文件夹;【root账户;cd /root/ --> rm -rf nginx-1.14.0 --> rm -f nginx-1.14.0.tar.gz】;11、浏览器访问你的centos IP ;192.168.79.130:80 //默认端口号为80; centosip+端口号 如下展示,即表示安装和配置都没问题了;================================================================================篇二、介绍Nginx 配置说明及实例使用【详细】,小伙伴可挪步前往!====> blog.csdn.net/weixin_4397…
方法亲测有效,如有问题,欢迎下方留言!问题描述:vue-cli搭建的环境,用nginx做代理服务器,访问时显示:Invalid Host header;解决办法:设置跳过host检查1、在build目录下的webpack.dev.conf.js文件,devServer下添加disableHostCheck: true,跳过检查2、同样的原理,可以在package.json文件修改scripts命令:webpack-dev-server --disableHostCheck=true 3、如上修改,即可通过你设置的域名加端口号成功页面访问
2023年08月
2022年05月