自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 把 Excel 当作一种协议来看,代码实现起来就简单多了

提出问题日常工作中,我们经常会遇到使用 Excel 批量导入的需求,正常情况下,我们会在 Controller 中接收前端传过来的文件流,并进行解析@RequestMapping("importExcel")public ResultDTO<List<UserExcelDTO>> importExcel(@RequestParam("file") MultipartFile file) { try (InputStream in = file.getInputStr

2022-01-29 18:29:20 2113

原创 js完美地处理转换 Excel 的日期格式

问题提出在使用 js 做 Excel 文件读取时,我们发现对于日期的处理很棘手。主要存在以下几种情况:所有的日期单元格读取到的是一个类似 44211.7533 的数字的问题格式不规范问题,如 2021-1-1 0:0:00按指定格式格式化的问题带着这几个问题,我在网上找了几篇文章,但是都不能很好地解决,所以自己动手解决,并整理分享出来,希望对大家有所帮助解决方案/** * 处理从 Excel 单元格中读取到的日期格式的字段并转换为指定格式的日期字符串 * * @param {str

2021-01-17 17:22:35 4657 5

原创 一个简单高效的随机对象生成神器

遇到的问题在日常开发过程中,当我们要编写单元测试或集成测试的时候,我们往往有这样的需求:生成测试对象。这样的对象,我们往往不关心其具体是什么值,只要里面的字段不为空即可(避免空指针、满足数据库表非空约束、参数非空校验约束等)。java.utiil.random 包给我们提供了 nextInt(), nextLong(), nextDouble(), nextFloat(), nextBytes(), nextBoolean() 和 nextGaussian() 这样的函数,用来生成原始类型对象,但是对于

2020-11-15 14:58:48 2519

原创 前端必备工具类

Http请求工具注意,大部分情况下,我们后端返回的数据格式都是类似{ "code": 0, "data": {}, "msg": ""}所以我们在请求工具中可以统一检查 code,如果返回正确则只返回 data 中的数据import axios from 'axios';// 创建axios实例var instance = axios.create({ timeo...

2020-01-30 09:16:35 477

原创 如何导出复杂格式的Excel文件?

前言我们平时开发会需要做一些 Excel 导出的需求,简单快捷的方式是使用 EasyExcel 来做,如果是简单的数据导出,我们可以在POJO上打ExcelProperty注解,然后直接调用 EasyExcel.write 静态方法,一行代码就搞定了!如:// 定义模型@Datapublic class Student { @ExcelProperty(value = "姓名", ...

2020-01-30 08:21:28 2752

原创 使用 SpringAOP + hibernate-validator 完美实现自动参数校验

在前面的文章《Spring 参数校验最佳实践》 中,我们介绍过 SpringMVC 如何做自动参数校验并通过统一异常处理机制在校验不通过时返回统一的异常。然而这并不完美,如果我们用的是 RequestBody 来接收的参数,一旦校验失败,我们在统一异常处理中并不能获取到完整的参数列表。另外,有些时候我们用的框架可能没有包含参数校验的功能,例如一些 RPC 框架。这种情况下,我们可以通过 Spri...

2019-09-28 12:06:16 1066

原创 从根上讲讲AOP——手敲一个简单的实现

前段时间学习 AOP(面向切面编程) 的知识,翻译了一篇文章:Spring AOP 最热门面试题及答案,没想到发布之后阅读量非常高(看来,标题真的很重要),但其实那篇译文讲得并不是很好,在文章最前面我也说了,只是因为概念介绍比较全面,所以翻译过来加深印象,意想不到的是这篇文章居然在百度“SpringAOP面试”关键词排名第一位。在比较深入的学习了 AOP 的知识并应用于实际开发中,解决了很多问题...

2019-08-16 21:57:00 2833 5

原创 【极致】一个 jar 包的自我修养

事事留心皆学问在开发过程中,可能我们天天都是在写一些 CRUD 的业务代码,有些人会觉得无聊,会觉得时间长了也没有长进。但是其实事事留心皆学问,就算是业务代码,也有很多可以提升自己能力的事情可以做,可以学习。我们要做的,就是比别人多走一步,我思考一点。我发现,提供一个公共的 jar 包,很多人都只是对其功能负责,只要功能使用没问题,就算是完事了,但其实远远不够。当用户使用 jar 包的时候,可...

2019-07-01 13:10:58 574

原创 最简单的方式使用原生 js 发送 http 请求

使用场景检查接口可用性主要用于在没有引入 jQuery 等工具的页面上需要验证一些 api 能否调得通的时候,可以快速调出浏览器调试界面发请求。 这在判断是否存在跨域问题的场景下,特别好用。验证接口用于爬虫另外,因为在浏览器调试界面发起的请求跟页面自身的 js 发起的请求是一样的,所以可以不用关心登录状态等上下文环境的问题。这在写爬虫的时候特别实用——抓到一个链接之后,直接在浏览器上进行验...

2019-06-23 18:35:10 15255

原创 【深度好文】深度分析如何获取方法参数名

发现问题对Java字节码有一定了解的朋友应该知道,Java 在编译的时候,默认会将方法参数名丢弃,因此我们无法在运行时获取参数名称。但是在使用 SpringMVC 的时候,我发现一个奇怪的现象,当我们需要接收请求参数的时候,相应的 Controller 方法只需要正常声明,就可以直接接收正确的参数,例如:注:以下例子使用 maven 进行编译,且非 SpringBoot 项目,SpringB...

2019-06-18 13:46:04 1063

原创 Spring 参数校验最佳实践(附完整实例)

前言在 Web 开发中, 我们经常需要校验各种参数,这是一件繁琐又重要的事情,对于很多人来说,在做参数校验的时候,会有以下几种类型的处理方式:甩锅型校验太麻烦了,让客户端去负责校验就行了,调用方传错了是调用方的问题,不是服务的问题,甩个 500 错误让他们好好反省:劳模型有多少参数,我就写多少个 if 语句做判断,校验不通过的都写一句友好的提示,如:工具型自己写个参数校验的通用工...

2019-06-03 13:02:14 6770 3

原创 为什么阿里代码规约要求避免使用 Apache BeanUtils 进行属性的拷贝

缘起有一次开发过程中,刚好看到一个小伙伴在调用 set 方法,将一个数据库中查询出来的 PO 对象的属性拷贝到 Vo 对象中,类似这样:可以看出,Po 和 Vo 两个类的字段绝大部分是一样的,我们一个个地调用 set 方法只是做了一些重复的冗长的操作。这种操作非常容易出错,因为对象的属性太多,有可能会漏掉一两个,而且肉眼很难察觉。类似这样的操作,我们可以很容易想到,可以通过反射来解决。其实...

2019-05-30 13:07:13 5195 2

原创 记住这 7 条,从此告别 NullPointerException NPE

万恶的 NPE有开发经验的开发人员应该都知道 Java 中的空指针异常 NullPointerException(NPE),当我们试图使用一个值为 null 的对象引用时,就会抛出这个异常。public class NpeDemo{ public static void main(String[] args){ NpeDemo npeDemo = null; ...

2019-05-24 14:10:09 1011

原创 一文搞定 log4j、log4j2、logback 自定义 appender(附完整实例)

缘起随着系统微服务化的开展,越来越多的服务被建立起来,而且服务都布署到公司私有云平台上。这个进程中,日志查看的问题逐渐暴露出来。首先,分布式系统,程序部署在不同的机器上,查询日志需要登录到各台机器上,很不方便;其次,云服务使用 Docker 虚拟技术,当服务重新部署时,机器上的文件会全部抹除,因此日志文件也会因为服务重启或升级导致丢失。所以,目前我们团队非常需要一个分布式日志的解决方案。查了...

2019-05-19 23:32:26 6306

原创 快速开始,使用 VSCode 开发 Vue 项目如何配置语法高亮和自动格式化

关于 IDE开发 Vue 项目,一般使用 VSCode/WebStorm/Atom 等 IDE,推荐使用 VSCode。而 VSCode 原生不支持 Vue 语法高亮和自动格式化等功能,需要通过插件来支持。安装插件点击 首选项 -> 扩展,安装以下插件:Vetur – vue 必备插件,用于语法高亮和代码提示Auto Close Tag – 自动完成标签,如输入 时,自动添加...

2019-05-15 19:16:17 2592

原创 Java比较两个对象并获取其中不相等的字段

写在前面在工作中,我们经常会遇到这样的需求——比较两个对象是否相等,如果不相等的话,取出不相等的字段。以下这些场景都需要我们对一个对象进行比较:数据比对做单元测试断言对象是否相等前端要求对不相等的字段进行高亮显示这种需求其实是非常简单的,但是如何优雅地解决这一类需求呢?通常的做法是重写对象的 equals 方法。但是重写 equals 方法有很多不便之处,例如:每次对象属性有...

2019-03-24 23:22:41 15589 37

原创 Java实现 IPv6 与 long 相互转换

缘起前些天写了一篇《ip 地址与 int 整数的相互转换》,公众号 Java面试那些事 转发了这篇文章,有读者评论问到 IPv6 的转换方法,于是抽时间也自己实现了一下。IPv6 定义IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙...

2019-03-19 20:00:11 6350 2

原创 带定时刷新功能的本地缓存简单实现

写在前面到有些业务场景中,需要在启动的时候取一些比较少改动(但是有可能会改动)而且量也比较小的数据,主要是一些基础配置类的数据。这些数据实时性要求很低,目前的解决方式是放在 redis 做缓存,并设置过期时间,相当于定期刷新。但是,其实还可以更进一步优化。毕竟 redis 跟 web 服务器不在同一台服务器上,也是需要远程IO的(redis很快,一般不用考虑这个问题),因此其实还可以做一级本地...

2019-03-12 23:39:04 8696 4

原创 给你三个线程,如何让它们交替打印1、2、3

问题提出前几天写了一篇 Java多线程:写一下两个线程交替打印 0~100 的奇偶数 介绍了如果用 wait/notify 控制两个线程交替执行,最后留了一个扩展问题:有三个线程,要求让它们交替输出 1、2、3,打印内容如下:线程1:1线程2:2线程3:3线程1:1线程2:2线程3:3……该如何实现?分析沿用两个线程的交替打印的思路,重点是当第一个线程获取到锁的时候第二个线...

2019-03-10 14:28:22 9753 5

原创 Java多线程:写一下两个线程交替打印 0~100 的奇偶数

面试场景面试官:Java多线程了解吗?你给我写一下,起两个线程交替打印0~100的奇偶数。小黄:啊?面试官:就是有两个线程,一个线程打印奇数另一个打印偶数,它们交替输出。类似这样偶线程:0奇线程:1偶线程:2……奇线程:99偶线程:100小黄:啊?面试官:……嗯。好的。回去等通知吧。解说遇到这种突如其来的面试题,有时候会让人无从下手。尽管可能你学习过多线程的知识,但是面...

2019-03-07 19:36:04 17472 7

原创 ip 地址与 int 整数的相互转换,Java 基于位运算 7 行代码实现

缘起面试官:“Ipv4地址可以转为Long类型的数字知道吧?你写一下这个转换的代码。”对计算机基础逐渐模糊的小黄一脸懵逼,毕竟工作中很少会用到,只记得ip地址和整数是可以相互转换的,但是从来没有自己实现过。于是在大脑中飞速计算。过了一会,思路出现了:ip 地址分为四段,每段都是 0~255 之间的数,每段可以用 8 位来装下它,4x8=32位,也就是可以将ip地址转为 32 位的整数。咦?面试...

2019-03-03 23:43:33 7362 13

翻译 先写单元测试的12个好处

译者的话测试驱动(TDD)的思想早有耳闻,但是我们都只是知道它有很多好处,却很少有人实践。其实我们对其优势并没有全面的了解。最近我阅读了许多这方面非常优秀的文章。如果有时间我会多翻译一些发出来。这是单元测试系列的第二篇译文。原文链接:Twelve Benefits of Writing Unit Tests First系列第一篇译文可查看:打桩(Stubbing), Mocking 和服务虚...

2019-01-18 22:37:27 3156 1

原创 Java用ASM写一个HelloWorld程序

ASM 是什么ASM 官方 的定义是:ASM是一个通用的 Java 字节码操控和分析框架。它可以用于修改已有的类也可以直接以字节数组的方式生成类。ASM 提供了一些常用的字节码转换和分析算法,从中可以构建自定义的复杂转换和源码分析工具。ASM提供了与其他 Java 字节码框架类似的方法,但是更注重性能。因为它被设计和实现成尽可能小和快,所以非常适用于动态系统(当然也可以用于静态的方式,例如在...

2019-01-13 13:43:10 11572 1

翻译 打桩(Stubbing), Mocking 和服务虚拟化的差异

译者的话《JUnit实战》开篇第一句话说,所有的代码都需要进行测试。近期准备在团队内部做一次关于单元测试的分享,为了准备这次分享,我把最近探索的一些单元测试的理念和具体方法做了下总结。我发现InfoQ上的这篇文章 stubbing-mocking-service-virtualization-differences 对我的影响比较大。之前写过两篇文章也是因为受到这篇文章的影响而写就的如何利...

2019-01-12 17:24:03 4058

原创 【shell脚本】将指定目录及其子目录下的mp4文件转换成mp3格式

功能递归提取指定的目录及其子目录中的mp4视频文件中的音频并转换成mp3格式的文件(生成的文件放在mp4文件旁边与原文件同名不同后缀)脚本及使用创建文件vim transfer.sh脚本内容#!/bin/bash# 此脚本用于将指定目录及其子目录下的mp4文件转换成mp3格式function getdir(){ for element in `ls $1` do ...

2019-01-04 22:40:27 1205

原创 CentOS6和CentOS7环境下RabbitMQ安装配置和非ROOT权限启动及集群搭建最完整教程

前言最近负责的一个项目需要使用 WebSocket 做前后端通信,我使用了Spring提供支持的STOMP协议,它可以解决 WebSocket 消息的语义化和集群状态下各集群节点之间消息共享的问题,例如用户连接了机器 A,但是机器 B需要知道该用户的在线状态和向这个用户推送消息。这是WebSocket集群状态下必然要面对的问题。传统的做法是使用分布式session、redis或者通过消息队列来...

2019-01-04 14:26:25 4010 1

原创 WireMock初体验,一个强大的HTTP 请求模拟测试框架

缘起最近我创建并维护了一个开源项目 http-api-invoker ,该项目实现将 HTTP 请求和接口进行绑定,让 HTTP 接口调用跟调用本地方法一样自然优雅。在写单元测试的时候,因为需要发送 HTTP 请求,而做为一个完整独立的项目,我并不希望对它进行单测还需要依赖其他的项目。最开始我用的是 Mockito。为了让代码更易于测试,我将真正发送请求的任务交给一个接口(Requestor...

2018-12-25 23:29:00 8478

原创 Java如何优雅地调用发送HTTP请求,支持上传和下载文件(GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS/TRACE)

HTTP接口调用框架项目地址:https://github.com/dadiyang/http-api-invoker让http调用跟本地方法调用一样自然优雅将http请求url和接口绑定,由框架生成接口的代理类,直接调用接口的方法就会自动构建请求参数并发送请求,然后处理请求响应转换为接口方法的返回值返回(支持泛型)。若与 Spring 集成(可选),更能使用 @Autowired 进行自...

2018-12-22 23:21:32 4524 10

原创 完美解决:Java微信语音amr格式转mp3格式,兼容Linux/Mac/Windows,支持Maven

少费话,先上代码引入 maven 依赖 &amp;amp;amp;amp;amp;lt;dependency&amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;lt;groupId&amp;amp;amp;amp;amp;gt;com.github.dadiyang&amp;amp;amp;amp;amp;lt;/groupId&amp;amp;amp;amp;amp;gt; &amp;amp

2018-12-14 14:34:56 8789 57

原创 另辟蹊径:如何利用打桩和Mock的思想模拟WebSocket,实现彻底前后端分离独立开发

问题提出之前的文章里,我介绍了 如何在Vue项目中使用Mockjs,模拟接口返回的数据,实现前后端分离独立开发 ,而且也解决了Mockjs如何拦截带参数的GET请求 的问题。最近接到一个开发客服IM的任务,需要用到 WebSocket 做前后端实时消息推送,在做页面的时候发现页面的http请求可以使用Mockjs来拦截并返回mock出来的数据,但是 WebSocket 却很难做到。于是查了很多...

2018-12-12 00:22:03 4383

原创 可能是全网最靠谱的rabbitmq安装教程

前言RabbitMQ非常出名,但是它依赖erlang,在Linux服务器上安装起来简直是逆天的烦琐,各种错误,足以让你搞一整天。经过摸索,终于找到了比较靠谱的安装方式。大家可以试一下。用到的文件,请看后面的网盘链接。这里我只在 CentOS6 上安装成功了。其他系统流程应该是一样的。安装rpm -ivh erlang-21.1.4-1.el6.x86_64.rpmrpm --import ...

2018-12-01 19:03:49 219

原创 AOP实战:一个面向切面的实战项目,方法级别的简单监控

AOP实战:一个面向切面的实践项目,方法级别的简单监控背景在开发过程中,我们经常会需要对方法进行一些简单的监控,例如监控某个方法的执行时间,必要的时候打印入参和返回值,对抛出的异常进行监控。这样的一些监控点虽然很小,但是这些重复的代码散落在各处而且侵入到业务逻辑当中让业务代码显得非常杂乱。因此,将这个切面抽离出来变得非常有意义,所以有了本项目。(完整代码请查看 simplemonitor)...

2018-11-20 02:12:31 2897

原创 vue使用正则一键替换按需加载写法

问题提出当打包构建应用时,Javascript 包会变得非常大,影响页面加载。这时按需加载就显得非常必要。可以参考 路由懒加载 这一节。如果你的项目一开始没有使用按需加载,到达一定的规模之后发现需要按需加载,这时候会遇到一个重构老代码的问题。我就遇到了这样的情况,其中工作量最大的其实是将import Comp from "@/components/home/Comp";替换成const ...

2018-11-06 11:33:05 1951

原创 WebSocket使用SockJS原来可以这么简单(附Spring实现完整实例)

基于 SockJS 的 WebSocket在学习 《Spring实战》 第18章的时候才知道,原来在不支持WebSocket的情况下,也可以很简单地实现WebSocket的功能的,方法就是使用 SockJS。它会优先选择WebSocket进行连接,但是当服务器或客户端不支持WebSocket时,会自动在 XHR流、XDR流、iFrame事件源、iFrame HTML文件、XHR轮询、XDR轮询、...

2018-11-04 14:19:44 26786

原创 SpringBoot使用@RunWith(Parameterized.class)进行参数化测试同时支持依赖注入,以及CommandLineRunner在单元测试时不执行主进程

问题提出在使用SpringBoot进行单元测试的时候,我发现了两个问题使用参数化测试的时候,必须使用 @RunWith(Parameterized.class),而对Spring进行单元测试时,如果想使用依赖注入,即使用 @Autowired 注解,需要使用 @RunWith(SpringRunner.class) 。两个不能同时使用。如果 SpringBootApplication 在启...

2018-10-14 14:36:28 5765 2

翻译 Spring AOP 最热门面试题及答案

译者的话前几天去京东面试,被问到 AOP 相关的问题,之前一直没有系统地学习相关的知识,答得不是很好。趁着假期,找了一下相关的资料,CSDN上有很多不错的文章,看了之后对 AOP 有比较好的理解了。然后 Google 了一下 AOP 相关面试题(AOP interview),搜出来的第一条结果是一个叫 HowToDoInJava 的网站上的一篇文章 Top Spring AOP Intervie...

2018-10-02 00:15:16 95159 13

原创 Java实现漏斗限流算法

前言最近在学习老钱的《Redis深度历险:核心原理与应用实践》,其中讲到了漏斗限流,在Redis中可以使用 Redis-Cell 模块来做基于Redis的限流方案。在讲解原理的时候,老钱给出了 Python 和 Java 版的实现,看完之后发现其设计非常精妙,于是自己也根据其原理自己动手敲了一下代码,把 Java 版本的漏斗实现出来了。实现代码import java.util.Map;im...

2018-09-28 17:38:09 6653 5

原创 Mockjs如何拦截带参数的GET请求

之前写了一篇文章 如何在Vue项目中使用Mockjs,模拟接口返回的数据,实现前后端分离独立开发 阅读量还算挺高的,看来 Mockjs 是非常受欢迎的。在实践过程中,发现 Mockjs 本身对 GET 请求的支持并不是很友好。举个例子,使用 Mock.mock(&quot;/user/getUserInfo&quot;, &quot;get&quot;, mockData) 的时候,它只会拦截url等于 /user/getUserI...

2018-09-23 21:40:13 35849 6

翻译 JVM和垃圾回收面试入门,这一篇就够了

JVM和垃圾回收面试入门,这一篇就够了前些天在 google 上搜索了一些JVM的参考资料,偶然发现了一篇文章,如获至宝,简单易懂而且相对全面的JVM和垃圾回收介绍写得非常的棒,因此一直保存着,今天有时间特意翻译了一下。本人水平有限,但是遇到好文章希望可以与更多的人分享,特此发布此文。英文OK的话,可以查看 原文前言JVM是大多数开发人员的致命弱点,甚至可能导致老练的开发者一败涂地。事实...

2018-09-23 17:24:46 5410 2

原创 Java跨域问题的解决方案及axios的跨域请求方法封装

原因出于安全考虑,浏览器有一个同源策略。浏览器中,异步请求的地址与目标地址的协议、域名和端口号三者与当前有不同,就属于跨域请求。限制跨域访问是浏览器的一个安全策略,因为如果没有这个策略,那么就有被跨站攻击的危险。比如,攻击者在自己的网站A放置一个表单,这个表单发起DELETE请求,删除某个用户在B网站上的个人资料。如果没有同源策略保护,那么在同一个浏览器内,如果用户已经登录了B网站,这个删...

2018-05-12 11:28:57 2641 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除