JAVA
文章平均质量分 58
JAVA相关技术
隐形喷火龙
十多年互联网从业经验,一个有创意的全栈程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
监听进程是否被杀并重试
本文介绍了解决Java调用LibreOffice转换文件时进程异常退出的方案。当处理大文件时,LibreOffice进程可能异常终止但SDK不反馈,导致Java线程卡死。解决方案包括:1)使用ps命令检查进程是否存活;2)通过FutureTask实现异步监控和任务终止;3)加入重试机制,当进程异常时自动终止当前任务并重试。文中提供了完整的Java代码示例,展示了如何执行Linux命令检查进程状态、使用FutureTask管理异步任务,以及实现带有重试逻辑的文件转换流程。原创 2025-09-25 13:09:54 · 557 阅读 · 0 评论 -
Java线程卡死问题定位
摘要:文章探讨了FTP下载时遇到的线程锁死问题,表现为方法调用无响应且未打日志。通过线程分析步骤:1)获取Java进程PID;2)用jstack生成线程dump;3)分析BLOCKED/WAITING状态线程,定位到锁持有者在FTP下载操作中卡死。优化方案:1)改用分布式乐观锁快速失败机制;2)配置FTP保活参数setControlKeepAliveTimeout;3)强调网络操作必须设置超时或保活。根本原因是未处理网络阻塞导致锁长期占用,建议对IO操作添加超时控制以防止线程死锁。原创 2025-06-06 10:48:20 · 1017 阅读 · 0 评论 -
使用java实现word转pdf,html以及rtf转word,pdf,html
摘要: LibreOffice是免费开源的RTF转Word最佳方案,支持Windows/Linux/macOS多平台及多种格式转换(PDF/HTML等)。Windows安装简单直接下载MSI包;Linux需手动安装老版本(如CentOS7)并解决中文乱码问题(添加Windows字体)。Java实现需引入jodconverter依赖,通过OfficeManager和DocumentConverter进行格式转换,需注意Linux环境可能出现的路径识别问题(需手动指定officeHome路径)。原创 2025-05-28 11:33:00 · 2006 阅读 · 0 评论 -
Jackson中的ObjectMapper是否线程安全?
在我印象中,ObjectMapper应该是线程安全的,在项目中,对于json的操作我都是创建一个工具类,只实例化一个ObjectMapper去操作,直到我问了豆包,让我开始不确定了。我就把官网文档贴给她看,再问她,这时她终于回答线程安全了,但还是有点嘴硬,只承认2.12.4的版本是线程安全的。这个结果让我彻底不淡定了,也不知道她回答的对不对,只能去外网寻找答案。然后我追问, 如果不改配置,只序列化反序列化是否线程安全。还好官网给的答案是不修改配置的前提下是线程安全的。豆包是字节跳动旗下的AI,最近挺火的.原创 2024-12-26 16:53:26 · 758 阅读 · 0 评论 -
mysql中的json查询
需要用到json_contains函数,第一个参数是表的字段名,第二个参数是要查询的值,如果是字符串需要用双引号,第三个参数是path路径。查询语句跟普通的sql语句差不多,也就是字段名要用到path表达式。原创 2024-09-20 10:03:48 · 1460 阅读 · 0 评论 -
自定义校验--校验json长度
mysql8中支持json格式的字段,某些情况下使用很方便,但也带来一个问题,就是它的最大长度不能设置,最大支持4GB,如果有恶意程序保存一条4GB的数据进去,估计这张表就要卡死了,所以要加一个自定义校验,校验下json的长度,这里使用hibernate validator校验。原创 2024-08-28 14:22:27 · 652 阅读 · 0 评论 -
easyexcel--多sheet页导入导出
核心代码就是下图里面的,使用EasyExcel.writeSheet创建一个sheet,然后用excelWriter写入就行了,很简单。原创 2024-08-19 17:13:11 · 1811 阅读 · 0 评论 -
easyexcel--导入导出实现自定义格式转换
Override@Override/*** 这里读的时候会调用* @return*/@Override/*** 这里是写的时候会调用 不用管* @return*/@Override= null) {/*** 解析表达式 0:男,1:女,2:未知,根据0返回男或者男返回0* @param propertyValue 参数值* @param converterExp 表达式* @param separator 分隔符,例如逗号。原创 2024-08-19 15:29:40 · 1431 阅读 · 0 评论 -
easyexcel使用教程--导入导出简单案例
java中操作excel的库是poi,但是poi有很多问题,使用复杂,内存占用大等,阿里开源了一个操作excel的库叫easyexcel,它基于poi做了很多优化,平时读写excel建议使用这个库文档地址: 关于Easyexcel | Easy Excel 官网在实体类上写excel字段注解,ExcelProperty注解就是导出的列名,ExcelIgnoreUnannotated表示没加ExcelProperty注解的字段不会写入可以看到,excel数据成功写入了,但是标题换行了,如果想标题不原创 2024-08-08 17:03:34 · 710 阅读 · 0 评论 -
对接微信支付
公众号上支付使用jsapi,小程序支付看小程序支付文档,后台跟jsapi一样的,上面两种方式都是手机内支付,点支付按钮后唤起微信去支付如果是pc网站上弹出一个二维码,用手机扫描支付,就是native支付,原创 2024-07-08 10:18:43 · 1457 阅读 · 0 评论 -
对接kimi,打造聊天机器人,生成文档摘要
提取文档摘要我们先要把文档上传到kimi获取一个content,再调用聊天接口给提示词就行了@Operation(summary = "提取文档摘要")String hint = "请简要描述文档中的内容";原创 2024-04-23 16:38:16 · 4496 阅读 · 2 评论 -
easypoi--按照模板导出复杂样式的excel
导出excel通常使用的是apache poi,但是poi的api相当复杂,所以当导出的excel样式比较复杂时,写起来就比较头疼了,这里推荐使用。如果是变量,就用双大括号包裹变量,如果是列表,则使用$fe指令,maplist是变量名,t.id是要输出的字段,最后以t.hdje}}结果表示结束。, 可以很方便的根据模板来导出复杂excel。第二步,新建excel模板,然后写入内容。我们要实现如图所示效果,该怎么实现呢。第三步,获取数据,写入输出流。原创 2024-04-22 17:31:58 · 2130 阅读 · 0 评论 -
mybatis一对一,多对一,一对多--使用自动映射避免繁琐的resultMap
我们知道,相比较hibernate,mybatis的一对一,一对多都比较繁琐,hibernate可以直接在实体类里面配置好映射关系,获取值的时候就能把一对一和一对多的对象带出来了,而mybatis需要用到resultMap,需要在resultMap中把实体类与表字段的对应关系一一写出来,如果遇到关联表有相同字段名,还要写别名,画风往往是这样的:看着好像还行,但是要知道有些表可是有几十个字段的, 不仅要写resultMap,还要在sql中把所有列名写出来,这酸爽,看着就头疼,幸亏有个大杀器autoMappin原创 2024-04-19 13:39:02 · 1581 阅读 · 0 评论 -
定位一段文字在word文档哪个章节下面
接下来就简单了,我们通过遍历文档段落,查找该段落中是否包含指定文字,如果包含则说明该段文字属于该章节,很多人可能会去使用document.getParagraphs来遍历文档,但是这种方式只能获取段落内容,如果文档中包含表格则获取不到,所以为了完整的遍历文档可以使用XWPFWordExtractor这个类来提取文字。原创 2024-03-29 16:27:31 · 618 阅读 · 0 评论 -
比对word文档并提取差异片段(java版)
有时候,我们想比对两个word文档,标记出两个文档之间的差异,这样一眼就能看出来修改了哪些地方,如下图,左边文档中的扩招2000人删除了,辞呈改成了说明,新增了并且加重处罚等文字,是否一目了然了。原创 2024-03-27 17:02:15 · 3199 阅读 · 1 评论 -
使用java比较word文档内容
要比较word文档内容,我们需要先读取word文档,这里使用poi库,至于比较内容,可以使用apache的commons-text库。原创 2024-03-21 14:36:10 · 1893 阅读 · 0 评论 -
IDEA 下载依赖包源码报错 Cannot download sources Sources not found for:XXX
最近在做一个功能的时候想看一个库的源码,结果源码下不下来,报Cannot download sources Sources not found for:XXX,网上搜了半天,也找不到靠谱的结论后来想了下,应该是镜像那边出了问题,把镜像一删,源码就能下了,用的还是阿里云的镜像,有点坑,后来一搜,发现是阿里云镜像的地址变更了,我还在用老的地址,难怪了。原创 2024-03-20 16:02:29 · 1210 阅读 · 0 评论 -
Caused by: java.lang.NoSuchFieldError 问题解决方案
最近改了下依赖包版本,编译启动没啥问题,但调接口的时候报错了遇到这种问题一般都是依赖包版本冲突造成的。原创 2024-03-08 14:05:09 · 4534 阅读 · 0 评论 -
canal1.1.7实战
canal可以用来监听mysql数据库的变化,用来同步数据包下载地址:下载完后,在linux上新建一个canal文件夹,放入tar包解压: tar -zxvf canal.xxx.tar.gz解压完后修改配置文件查看conf/canal.properties,其中canal.port是客户端连接的端口,需要放开,canal.admin.user和canal.admin.passwd是客户端连接的账号。原创 2023-11-17 16:19:48 · 2640 阅读 · 0 评论 -
设计模式(四)--装饰者模式(Decorator/Wrapper Pattern)
CondimentDecorator是加调料的装饰类,之所以要继承Beverage,是为了继承其类型,这样使用饮料的地方就能用这个装饰者来代替。根据需求,其实就是在原有类上加强功能,并且功能是可以灵活组合的,比如可以加奶,加豆浆,或者加双倍的奶,这就可以使用装饰者模式。现在咖啡店想要给咖啡加调料,根据调料不同,显示的描述不同,价格也不同,应该如何设计系统呢?可以看到装饰类都需要传入真正的饮料,也就是被装饰的对象,然后在其基础上做功能的加强。测试一下代码,发现可正确计算出价格。下面看下装饰类的实现。原创 2023-03-08 11:39:29 · 1145 阅读 · 0 评论 -
设计模式(三)--适配器模式(Adapter Pattern)
比如我们日常开发中使用到的slf4j就使用了适配器模式,slf4j提供了一系列打日志的api,底层调用的是log4j或者logback来打日志,而作为调用者,不需要关心底层具体使用的是哪种库,只需要调用slf4j的api就行了。下面我们来模拟slf4j的实现过程,这是slf4j的api,我们的系统中都是通过这个api来打日志的,就像我们生活中用到的电器都是220v的。这是log4j的api,与我们使用的日志api不兼容,就像我们去日本旅游,他们的电压是110V的,我们带过去的电器都没法使用。原创 2023-03-06 14:38:56 · 1350 阅读 · 0 评论 -
设计模式(二)--建造者(Builder)模式
我们知道,手机就是由cpu,内存,外存,相机,主板等构成的,我们使用手机这个产品的时候,不会关心手机是如何组装的,只会关心手机的各项参数,比如内存是8G的,闪存是128G的,所以我们在选择手机的时候需要告诉建造者你需要什么参数,等配置完参数,再由建造者来组装手机。建造者模式里面有两种角色,一个是产品,一个是建造者,当产品的建造比较复杂,我们需要屏蔽建造的过程,又想暴露建造的细节以供调用者控制时,可以选择建造者模式。下面我们就以手机的建造为例来讲解。建立一个测试类来测试。原创 2023-03-06 13:32:49 · 1093 阅读 · 0 评论 -
centos7下安装无头浏览器(headless Chrome)
reposelenium是当前流行的WEB自动化工具,它可以启动本地浏览器,访问网页,模拟点击操作等,在自动化测试和网络爬虫中非常有用。一般开发环境都是有图形界面的,所以本地只要安装普通浏览器就行了,但是在服务器环境是没有图形界面的,所以需要安装无头浏览器,所谓无头浏览器就是没有图形界面,但仍能实现浏览器访问网页,渲染网页的功能。原创 2022-09-07 15:16:14 · 3875 阅读 · 0 评论 -
极简idea下git操作(二)- 合并分支,版本回退,Cherry-Pick
这篇讲些git的高级应用,如分支操作,版本回退,bug修复流程等。原创 2022-09-02 17:07:23 · 5440 阅读 · 0 评论 -
极简idea下git操作(一)- 代码提交,版本冲突
git是现今公司项目中用的最多的代码版本管理工具,而idea是java中用的最多的开发工具,idea就像一把瑞士军刀,里面集成了很多开箱即用的功能,其中就包括了git,今天我们来记录下平时开发中常用的git操作。原创 2022-09-02 15:44:29 · 4640 阅读 · 0 评论 -
jks证书导入p7b证书公钥
jks证书导入p7b证书公钥原创 2022-07-08 14:34:47 · 3560 阅读 · 0 评论 -
AS2协议详解(三)
AS2协议本身比较复杂,我们不需要了解其中太多细节,只需要知道一些重要概念就行了。AS2是基于HTTP/HTTPS的,消息的格式使用MIME,就是邮件的格式,使用SHA1或SHA2加RSA进行签名,使用S/MIME进行加密。S/MIME加密本质就是3DES或者AES加RSA加密,有了之前的基础应该就很清楚了。AS2的通信双方称为partner,每个partner有个partnerId,通信双方需要交互彼此的公钥。自己实现S/MIME加密比较复杂,我们引入以下包来加密,jdk15on支持jdk1.原创 2022-05-07 14:54:08 · 5554 阅读 · 9 评论 -
AS2协议详解(二)
上一篇中主要讲解了加密的理论知识,这篇来上代码。签名和验签通过信息摘要算法和非对称加密,可以实现信息的防伪造,防篡改,通过我们的私钥来签名消息,接收方就能通过我们的公钥来校验该消息是否是我们发送的。/** * 获取证书库 */public static KeyStore getKeyStore(InputStream keyStoreInputStream, String keyStorePassword, String keyStoreType) throws Exception {原创 2022-05-07 14:14:06 · 3254 阅读 · 4 评论 -
AS2协议详解(一)
在沃尔玛要求其供应商使用该协议之后,AS2(或Applicability Statement 2)快速流行起来。许多其他大型零售商也纷纷效仿,这意味着AS2迅速成为许多行业点对点连接的最流行EDI传输协议。但是在国内,该协议使用的很少,资料也很稀缺,今天我把所学的知识整理一下,同时提供一个JAVA的实现版本,方便大家集成AS2。原创 2022-05-07 13:46:58 · 4142 阅读 · 0 评论 -
设计模式(一)--编程界的九阳神功
在学习设计模式前,我们先要弄明白一个问题,那就是为什么要学习设计模式?在JAVA领域,大部分使用的是贫血模型,业务逻辑都是service之间的调用,类似于函数式编程,其他高深的东西都封装于框架中,平时能用上设计模式的地方确实不多,似乎学习了也没啥用。我觉得设计模式特别像九阳神功,练成「九阳神功」后,内力自生速度奇快,无穷无尽,普通拳脚也能使出绝大攻击力,学习了设计模式,虽然还是普通的功能,却在稳定性,可维护性上大不相同了。九阳神功是融会贯通武学体系,练成后天下武学皆附拾可用。学会了设计模式,再看各种原创 2021-10-29 15:03:43 · 4691 阅读 · 0 评论 -
使用POI生成文章标题
生成文章标题有两种方式,一种是自定义标题,还有一种是使用现有样式来生成,现在网上大部分是第一种方式,但这种方式有很多弊端,我们先来看第一种第一步,引入依赖<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version></dependency>原创 2021-09-24 13:53:09 · 9097 阅读 · 4 评论 -
SpringBoot入门-打印请求日志
在日志系统中打印请求信息是很有用的功能,在开发中可以方便调试,在生产中可以快速定位问题,同时这些日志信息可以同步给大数据系统进行数据挖掘与分析。在Spring中实现打印请求日志很简单,直接使用CommonsRequestLoggingFilter就行了,但是这个filter有个问题就是不打印请求method(GET,POST等),像restful风格的接口都是通过method来区分接口的,还有就是无法定制信息,比如想打印用户名什么的也无法实现,这个时候就需要改造下了。看spring源码我们发现这个类原创 2021-08-16 10:12:13 · 4468 阅读 · 0 评论 -
小白也能看懂的悲观锁,乐观锁(附生动案例)
积分扣款功能小美是新入职的程序猿,负责后台JAVA的开发工作。由于公司美女程序猿稀缺,领导特别安排小美在老李的工作组。老李是十多年的老程序员了,工作经验丰富,为人亲切,深受下属爱戴。加入老李的工作组不久,老李安排小美做一个积分商城扣款的功能。“不就是根据商品标价扣除下积分,然后保存下嘛,还不简单,我可是在学校年年拿奖学金的”!小美心想,于是很快动手开发起来。public void buyGoods(int integral) { //取出用户信息 User user = g原创 2021-08-13 10:07:26 · 2266 阅读 · 5 评论 -
SpringBoot入门-批量操作优化
批量选择处理是很多项目都会用到的常用功能。像人员角色选择,人员部门选择,人员门禁选择等。下图所示,左边是门禁列表,右边是人员列表,选择一个门禁,然后批量选择人员,选中的人员可以出入该门禁。对于这个功能一般怎么实现呢?先看数据库设计,由于是多对多的结构,需要建张中间表接下去删除door_id对应用户delete from user_door where door_id = ?再批量添加记录insert into user_door(?,?,?)如上图选择了两个人,所以这..原创 2021-08-12 10:21:50 · 2063 阅读 · 0 评论 -
SpringBoot入门-分组校验
我们在开发的时候会有这样的需求,当新增时不需要校验id,但当修改时id不能为空,这时就要用到分组校验了。第一步,新增UpdateGroup接口作为更新操作的标识public interface UpdateGroup {}第二步,只有更新操作才需要校验的字段打上这个标识,其他没有这个标识的都是默认分组@NotNull(groups = UpdateGroup.class)private Integer id;@ApiModelProperty(value = "用户名")@No原创 2021-08-11 16:29:22 · 3103 阅读 · 0 评论 -
SpringBoot入门-数据校验
对于数据校验是前端做还是后端做,相信前后端的小伙伴们会为此扯皮很久。其实数据校验前后端都需要做,只是侧重点不一样。前端数据校验主要是提升用户体验,所以需要注重界面展示和提示信息,后端数据校验主要是防止恶意攻击和插入脏数据,同时还有些业务层面的限制只能后端来校验。本章不讲解业务层面的校验,只讲解通用的数据校验。SpringBoot通用数据校验一般使用hibernate validator.第一步引入依赖<!-- 数据校验 --><dependency> <原创 2021-08-11 09:34:48 · 1711 阅读 · 0 评论 -
SpringBoot入门-解决跨域问题
跨域是浏览器的安全策略,浏览器的ajax请求只支持同域名的访问,但是现在普遍都是前后端分离的开发方式,前端域名和后台域名往往不一致,这时就需要后台在响应头里面加个允许跨域的字段。如果在每个controller里面加这个响应头会非常繁琐,所以需要用到过滤器,处理所有请求。这里需要注意一下的是chrome遇到跨域请求时会发送一个option请求,如果这个option请求正常返回才会发送正常请求,遇到这个option请求需要处理下,不然接口会被调用两次@WebFilter(filterName =原创 2021-08-10 16:29:31 · 1457 阅读 · 0 评论 -
SpringBoot入门-文件上传
文件上传是每个项目都会用到的基础功能,这里讲解下实现过程和一些最佳实践接收方式后台如何接收前台传过来的文件呢?其实很简单,用MultipartFile就能接收@PostMapping("file")@ApiOperation(value = "上传文件")public Result uploadFile(@RequestParam("file") MultipartFile file) { return resultOk(uploadService.upload(file));}原创 2021-08-10 13:53:19 · 1771 阅读 · 0 评论 -
SpringBoot入门-统一错误码
有了上篇统一异常处理,接下去就要做统一错误码了,我们在与第三方平台对接时,经常会看到对接文档中有错误码一览,这样你在对接过程中可以快速定位问题,在我们的项目中该怎么实现呢。第一步,定义错误码接口public interface BaseErrorCode { //错误码 int getValue(); //错误描述 String getDesc();}第二步,在自定义异常类ServiceFailException中接收该接口并处理public Serv原创 2021-08-09 14:59:14 · 2784 阅读 · 0 评论 -
SpringBoot入门-统一异常处理
在项目的开发和调试中,错误难免发生。在java中这种程序错误就叫做异常,如果程序出现异常,会是什么样子呢。看下图这种异常展现方式有很多问题,首先对用户很不友好,而且里面包含了栈信息,造成安全隐患,同时对于前端小伙伴对接也会造成不便。通用异常处理java中所有异常的基类是Exception类,处理好这个类就能处理所有异常了SpringBoot为我们提供了@ControllerAdvice注解来处理异常@ControllerAdvicepublic class ExceptionC.原创 2021-08-09 14:07:37 · 1432 阅读 · 0 评论
分享