Java技术
Java开发框架、第三方库应用经验总结。
Neo Yang
长期从事电信增值服务软件的开发和设计工作。熟悉电信网络(固网,无线,数通)的规划、设计、评估业务及其IT系统的架构设计和实现方案。熟悉Java、C++语言及其开发框架。
展开
-
读取spring boot项目resource目录下的文件
项目开发过程中,有一些情况下将配置文件放在resource下能简化代码实现和部署时的打包步骤。例如: 项目中使用的数据库升级脚本、初始化脚本。将文件放到resource下,打包在jar包中,不能直接通过File路径读取。下面介绍两种读取文本文件内容和获取文件夹下所有子文件名的方法。原创 2023-12-19 11:21:26 · 441 阅读 · 0 评论 -
定义Mybatis拦截器动态切换postgre数据库schema
背景随着业务的发展和合规要求,产品数据库将切换到Postgres。之前不同技术域,不同交付工程的数据分库管理的方式切换到PG数据库后将通过分schema管理。ORM继续使用Mybatis,为使用迁移工作量极可能小,现有的SQL代码不做大的修改,考虑在Mybatis执行过程中做拦截,替换sql中的schema标识。提取请求参数中的schema约定rest接口请求参数中增加schema,通过切面技术从请求头中schema保持到线程变量中。1. 提取schema代码package com.postgr原创 2022-04-05 21:22:36 · 3970 阅读 · 6 评论 -
RabbitMQ应用Demo:支持多个消费者实例热插拔
需求背景有这样一些原因需要在项目中部署多个消费者实例:基于系统的可靠性提升要求。特别是基于微服务架构的容器部署方案,微服务多实例部署是保证系统可靠性的基本要求。系统负载分担的诉求,通过多实例部署提升系统整体响应效率。应对场景包括:1)同时启动多个消费者实例能同步处理MQ分派的消息。 2) 当其中一个消费者实例挂了后重启,能继续处理消息队列中的消息。3)部署动态增加一个消费者实例,能立即投入到接收消息,处理消息的过程中。方案分析要满足上面描述的应用场景,有两点需要处理:1)消费者自动确认消息修原创 2022-03-06 18:47:04 · 2450 阅读 · 0 评论 -
Java stream常用实例代码
应用场景定义对象实体场景一 根据属性过滤对象场景二 提取对象中的属性场景三 按对象属性分组定义对象实体package com.elon.model;/** * 简单用户实体类 * * @author elon */public class User { /** * 用户账号 */ private String account = ""; ...原创 2020-01-27 15:31:41 · 653 阅读 · 0 评论 -
Activiti应用实践(五)-查询BPMN XML文件和图片资源文件
一、概述Activiti流程部署后,前端也需要在页面上看到流程的定义,还有可能会修改。下面给的是获取图片资源文件和XML文件的样例代码。二、获取图片资源Activiti提供了经由BPMN XML文件生成png图片文件的功能,也有其它更强的能力。但需要解决不同环境,字体、乱码等问题。如果需求比较简单,只是需要静态查看一下流程的定义,倒是可以在部署时直接提供一张图片,后面再查询该图片返回给前端展...原创 2019-08-18 20:34:38 · 3154 阅读 · 0 评论 -
Activiti应用实践(四)-提交任务
一、概述在作业流管理中,如何一个流程节点完整后需要走到下一个节点都需要提交任务。创建请假申请电子流后需要提交,流程才能走到审批环节。审批人审批请假电子流,无论是审批通过或者审批不通过都需要提交,如果审批通过提交后流程结束,如果审批不通过,提交都驳回到申请人那里;这是通过不同的条件值实现的。二、示例代码/** * 提交任务。 * * @param taskId 任务ID * @retu...原创 2019-08-18 20:12:46 · 1287 阅读 · 0 评论 -
Activiti应用实践(三)-查询待办和已办任务
一、概述在开发作业管理功能时,查询某个用户的待办和已办任务是基本需求。activiti也提供了接口用于查询待办和已办任务。承接上两篇博客的介绍,这里的待办和已办是指审批人待审批的电子流和已审批完成的电子流。activitid的28张表中的act_ru_task记录了待办任务;act_hi_taskinst记录了历史的已办任务。二、实现逻辑/** * 查询用户待办任务列表。 * * @...原创 2019-08-18 19:47:43 · 26894 阅读 · 5 评论 -
Activiti应用实践(二)-流程部署和创建流程实例
接上一篇描述,开发完请假流程后可以导出一份bpmn格式的xml文件,这个文件可用于部署流程和创建流程实例。包含以下几个步骤:一、引入activiti依赖的jar包创建spring boot的maven项目,在pom文件中添加如下依赖項:<dependency> <groupId>org.activiti</groupId> <arti...原创 2019-08-17 12:08:47 · 2386 阅读 · 2 评论 -
Activiti应用实践(一)-流程开发环境搭建及开发示例
一、背景activiti是常用的作业流管理工具,由于最近的项目中涉及,提前研究一下。先从官方网站下载activiti流程编辑工具(https://www.activiti.org/get-started)。我下载的是6.0版本。二、部署安装包从下载的安装包中拷贝如下3个war到tomcat的webapps目录下。启动tomcat.,三、开发作业流启动tomcat后,打开http://l...原创 2019-08-11 16:08:33 · 508 阅读 · 0 评论 -
通过自定义spring invalidator注解校验数据合法性
在项目中经常会对用户输入的数据,或者外部导入的数据做合法性检查。在spring boot框架的服务中可以使用invalidator注解对数据做合法性,安全性做校验。下面给一个样例说明如何自定注解实现校验逻辑。一、定义校验属性字符串长度的注解package com.elon.springbootdemo.manager.invalidator;import java.lang.annotat...原创 2018-09-20 13:08:45 · 1630 阅读 · 0 评论 -
【经验随笔】Java通过代理访问互联网平台提供的WebService接口的一种方法
背景通常有两点原因需要通过代理访问互联网平台的提供的WebService接口: 1. 在公司企业内网访问外部互联网平台发布的接口,公司要求通过代理访问外网。 2. 频繁访问平台接口,IP被平台封了,需要寻求一个代理访问。下面以调用高德提供的坐标转换接口为例说明 如何设置代理高德提供了一个接口的URL 是:http://restapi.amap.com/v原创 2017-02-23 10:51:42 · 3242 阅读 · 0 评论 -
【经验随笔】Restlet Client发送XML格式参数消息
背景介绍Restlet Client是一款模拟客户端发送http请求的chrome插件,可以作为驱动调试后台程序,个人觉得比POSTMAN好用。CXF是一款发布restful服务的开源组件。编写restful接口一般都使用json串作为输入参数和返回值,调试的时候只要手工构造json串放到消息体,很简单。但是也有部分restful接口制定参数是xml格式。参数是Java类对象(参数clas原创 2017-07-13 23:04:53 · 2993 阅读 · 0 评论 -
GeoTools应用:提取Shape文件坐标系信息(4)
一、环境准备装配GeoTools有两种方式,一种是配置maven工程的pom文件(配置方式参考官网),另一种是下载geotools的jar包到本地导入依赖。我采用的是下载jar的方式,下载路径:https://sourceforge.net/projects/geotools/files/二、实现功能本章要描述的功能是如何从shape文件中读取坐标系信息。shape文件并不是一个文...原创 2018-06-28 13:36:10 · 4942 阅读 · 4 评论 -
GeoTools应用:读取Shape文件对象属性值(3)
一、环境准备装配GeoTools有两种方式,一种是配置maven工程的pom文件(配置方式参考官网),另一种是下载geotools的jar包到本地导入依赖。我采用的是下载jar的方式,下载路径:https://sourceforge.net/projects/geotools/files/二、实现功能前面两章讲了如何从shape文件中提取属性列头信息和对象的空间坐标数据。这章讲解如何从...原创 2018-06-27 13:42:20 · 3535 阅读 · 1 评论 -
GeoTools应用:读取Shape文件中的空间坐标数据(2)
一、环境准备装配GeoTools有两种方式,一种是配置maven工程的pom文件(配置方式参考官网),另一种是下载geotools的jar包到本地导入依赖。我采用的是下载jar的方式,下载路径:https://sourceforge.net/projects/geotools/files/二、实现功能本章要实现的功能是从shape文件中读取空间坐标数据,包括点、多线、多多边形数据的...原创 2018-06-26 13:16:03 · 3318 阅读 · 6 评论 -
GeoTools应用:提取Shape文件属性列头信息(1)
一、环境准备装配GeoTools有两种方式,一种是配置maven工程的pom文件(配置方式参考官网),另一种是下载geotools的jar包到本地导入依赖。我采用的是下载jar的方式,下载路径:https://sourceforge.net/projects/geotools/files/二、实现功能在实际项目中经常需要提取shape文件的属性列头信息,包含属性的名称和属性类型。下面的...原创 2018-06-24 11:49:36 · 1952 阅读 · 3 评论 -
使用Feign封装HTTP请求代码实例
总体说明现在的Web后端基本上都是采用微服务架构,服务间交互走http协议,通过restful接口。调用restful接口的方式很多,有用httpclient、RestTemplate, 使用第三组件如CXF。下面介绍使用第三件Feign做http请求客户端封装。不论采用哪种方式,都是为了使http接口请求native化–让客户端代码像调用本地接口那样调用远程接口。服务端发布restful接...原创 2019-06-16 15:14:20 · 2649 阅读 · 0 评论 -
Spring Boot配置mybatis+xml访问数据库代码样例
概述spring boot搭配mybatis访问数据库是微服务常见配置。mybatis支持注解和xml配置两种方式。下面给一个xml配置的样例。样例代码代码目录结构在application.yml中配置数据库urlserver: context-path: /elon/mybatisxml port: 10001spring: datasource: url: ...原创 2019-04-03 23:03:40 · 863 阅读 · 0 评论 -
Java编程基础:未配置JAVA_HOME环境变量使用mvn命令打包报找不到编译器的问题
问题描述前段时间遇到一个问题,一个mavn工程在eclipse里面能正常打包,在批处理脚本中打包就报错。操作方式是在mavan build…,输入 clean package -Dmaven.test.skip=true参数。在批出理脚本中使用的是 mvn clean package -Dmaven.test.skip=true。报错截图跟下面的类似: 原因分析从报错的原因来...原创 2018-06-29 13:53:20 · 1867 阅读 · 0 评论 -
Java编程基础:配置log4j2.xml同时输出日志到文件和控制台
开发Java服务端程序记日志是关键的。服务部署在云端,出了问题没有日志根本没法定位。现在比较流行是用Spring Boot搭建微服务框架,配置log4j2输出日志。 输出到标准输出的日志可以通过kabana收集和查看,同时程序员也希望能有文件记录完整的日志信息。下面给一份log4j2的xml配置样例,支持日志同时输出到标准输出和文件。&amp;amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;qu原创 2018-07-10 13:39:18 · 6545 阅读 · 0 评论 -
在SpringBoot框架服务启动时执行预处理逻辑的一种方法
有很多种场景需要支持服务启动时能预先做一部分逻辑处理。如在服务启动时提前将数据库或者配置文件中的静态数据加载到内存缓存;订阅发布模式中听众向消息中心注册监听的消息等。C++有全局变量,全局变量在dll加载时初始化,上面这些预处理方法可以在全局对象的构造函数中调用。Java中没有全局变量,SpringBoot提供了一种方案可以在main方法执行后调用自定义的处理逻辑:从ApplicationRu...原创 2018-08-29 00:39:06 · 1700 阅读 · 0 评论 -
Java编程基础:如何实现Mybatis查询数据库返回Map结构的数据
在开发过程中经常需要从数据库批量查询某类对象的主键ID与其中一个属性值的映射关系。目的是在接下来的业务处理中用主键ID去索引提起该属性值,这样做可以减少数据库查询次数,提高效率。但是在mybatis中没有直接查询返回map结果的接口(也许有,只是我不知道)。下面给出一种简易的方式能达到同样的目的。一、定义一个辅助类,用于存储从数据库中查询的主键和属性值package com.e...原创 2018-04-21 16:31:42 · 4766 阅读 · 1 评论 -
Java编程基础:MD5加密算法开发实例
一、概述MD5算法是一种不可逆的加密算法,经常用于用户登录密码,身份认证信息的加密。加密后的信息不需要解密还原,在认证的时候只需要对用户输入的密码再次加密,判断两段密文是否相同即可。下面给一个生产环境的MD5加密算法样例。二、MD5算法公共函数package com.elon.md5;import java.security.MessageDigest;import ...原创 2018-04-05 07:56:42 · 370 阅读 · 0 评论 -
Java编程基础:在Mybatis注解中使用typeHandler实现Java枚举与数据库int值的自动转换
概述在项目开发过程中经常会遇到数据库存储的是数值,在Java代码枚举表示的字段。这些字段在存储和查询时需要做一个转换:写数据库的时候将枚举转换为数字,读数据库时将数字转换为枚举。下面介绍一种通过mybatis注解实现数据类型自动转换的方式。该方式能处理所有存储模型和内存模型的数据类型不一致的场景,不局限于枚举和int值。一、在tbl_user表中增加一个字段sex用于表示性别性...原创 2018-04-02 13:56:12 · 5619 阅读 · 1 评论 -
FTP环境搭建及客户代码调用公共方法封装
一、背景大型系统架构往往被分解为多个独立可运行的组件, 以满足性能、可靠性、可扩展性的需求。多个组件间的数据交互往往采用两种方式:小量数据通过Sock函数、RMI、WebService等接口方式传递;大量采用文件方式传递。采用文件传递数据有两种方式:通过Windows的NFS系统,文件共享。采用FTP/SFTP做文件上传、下载。本文讲解采用FTP服务传递文件时,FTP服务器环境搭建及公共代码组件。原创 2015-11-03 23:40:41 · 723 阅读 · 0 评论 -
Java编程基础:浅析调用Java方法时的参数传递机制
在Java代码中调用方法时传递参数有两种方式:一种是传值,一种是传引用。如果是用Java的基本类型(int,boolean等)做参数认为是传值,如果是对象类型则认为是传引用。下面来剖析一下传对象引用这种场景。看下面这道Java基础题package com.elon.integertest;public class StartupIntegerTest { public ...原创 2018-03-18 14:40:28 · 549 阅读 · 0 评论 -
如何通过Spring Boot配置动态数据源访问多个数据库
之前写过一篇博客《Spring+Mybatis+Mysql搭建分布式数据库访问框架》描述如何通过Spring+Mybatis配置动态数据源访问多个数据库。但是之前的方案有一些限制(原博客中也描述了):只适用于数据库数量不多且固定的情况。针对数据库动态增加的情况无能为力。下面讲的方案能支持数据库动态增删,数量不限。一、数据库环境准备下面以Mysql为例,先在本地建3个数据库用于测试。...原创 2018-03-18 14:59:52 · 49822 阅读 · 106 评论 -
一道计算付款组合方式的平安科技面试题
无意中看到一道平安科技2017年的面试题(根据消费者手上的钱计算所有可能的付款方式),想到几年前写过一篇博客《换零钱算法分析及代码示例》,似乎可以借鉴一下思路。先根据用户手中钱币种类计算出所有可能的换零钱方式,再根据用户持有的钱币数量判断这种付款方式是否有效。一、面试题截图二、解题思路换零钱的思路是采用递归分解的思想,将某金额的钱币换成指定种类零钱的方式等价于换成必包含...原创 2018-03-18 20:55:55 · 682 阅读 · 0 评论 -
SpringBoot初探之Swagger配置
Swagger是一个用于描述和测试restful接口的工具,只要在定义restful接口时增加一些类和方法的描述注解,通过很简单的配置就可以得到一个展示接口定义的页面,也可以在页面上设置参数提交测试接口(替代postman的部分功能)。接口修改后不需要单独修改描述文档,swagger自动生成接口文档。下面讲一下如果搭建一个最简单swagger测试Demo。一、创建一个SpringBoo...原创 2018-03-18 21:09:49 · 310 阅读 · 0 评论 -
换零钱算法分析及代码示例
一 背景求将1块钱换成为1角、2角、5角有多少种拆分方法是一个经典的递归求解问题。可以扩展到将任意一个整数拆分为几种个更小的整数,有几种拆分方式的求解问题。 二 分析 基于这样一种分治思想:1块钱换1角,2角,5角的方式 = 1块钱换不包含第一种钱币的方法 + 1块钱换必包含第一种钱币的方法。从树型结构分析(下图以把3拆成1,2为例分析): 左子树描述的是不包含第一种钱原创 2011-09-17 09:54:38 · 2781 阅读 · 0 评论 -
JAVA通过COM接口操作PPT
一、 背景及要求在Eclipse环境下,开发JAVA代码操作PPT,支持对PPT模板的修改。包括修改文本标签、图表、表格。满足大多数软件生成PPT报告的要求,即先收工创建好模板,在程序中修改模板数据。二、 开发环境搭建下载jacob开源组件,解压后把jacob.jar添加到项目中。拷贝对应的dll文件到Path路径下。32位系统采用X86的dll, 64位系统采用X64的dll。 三、 实现合并原创 2015-12-17 00:02:26 · 5603 阅读 · 3 评论 -
通过Java WebService接口从服务端下载文件
一、 前言本文讲述如何通过webservice接口,从服务端下载文件、报告到客户端。适用于跨系统间的文件交互,传输文件不大的情况(控制在几百M以内)。对于这种情况搭建一个FTP环境,增加了系统部署的复杂度和系统对外暴露的接口。通过在服务端读取文件,返回字节流到客户端的方式比较简单。 下面采用restful的接口形式,满足SOA架构接口要求。如下代码拷贝到eclipse中即可运行,功能自测试原创 2015-07-21 23:50:11 · 19675 阅读 · 3 评论 -
Spring+Mybatis+Mysql搭建分布式数据库访问框架
一、前言用Java开发企业应用软件, 经常会采用Spring+MyBatis+Mysql搭建数据库框架。如果数据量很大,一个MYSQL库存储数据访问效率很低,往往会采用分库存储管理的方式。本文讲述如何通过Spring+Mybatis构建多数据库访问的架构,并采用多线程提升数据库的访问效率。需要说明一下,这种方式只适合数据库数量、名称固定,且不是特别多的情况。针对数据库数量不固定的情况,后面...原创 2015-11-03 23:27:27 · 20446 阅读 · 5 评论 -
SFTP环境搭建及客户代码调用公共方法封装
一、背景在开发应用软件的过程中,广泛使用FTP在各子系统间传送文本数据。但FTP存在安全问题,开放到外网存在安全漏洞,容易被攻击。替换方案是使用SFTP,SFTP提供更高的安全性,当然传输的效率也会有影响。实际使用中使用FTP还是SFTP需要根据系统使用的环境综合评估决定。本文档在继上一篇描述了FTP环境构建的基础上,进一步描述SFTP的环境构建和客户端调用公共方法的封装。二、SFTP Serv原创 2015-11-03 23:47:35 · 1353 阅读 · 0 评论 -
将PPT文件内容转换为图片放在Email邮件正文中发送
通过Email推送统计报告。一般除了要求将PPT报告文件作为附件发给用户,同时希望将报告内容在邮件中直观展示。 一份统计报告中经常包含柱状图、饼图、好看的图表,这些信息要直接在Email中展示比较复杂。本文推荐一种方式:将PPT图表内容转换为高保真的图片,将图片放到Email中发送,在不丢失用户体验的前提下,工作量尽可能小。一、 将PPT报告转换为PNG图片文件。有两种方式:一种是采用原创 2015-12-17 00:13:37 · 21999 阅读 · 0 评论 -
【经验随笔】Java程序远程调试定位特定运行环境上出现的问题
Java后台程序远程调试第一步:在JVM的启动参数中增加-Xdebug -Xrunjdwp:transport=dt_socket,address=6688,server=y,suspend=n第二步:在eclipse中, Debug Configurations -> Remote Java Application 连接调试。Tomcat程序远程调试第一步:在cmd窗口, cd切换到tomcat的原创 2017-06-27 13:10:01 · 878 阅读 · 0 评论 -
使用Ant打包Java后台程序
概述本文通过一个简单的Java Application例子描述如何用ANT完成基本的程序打包工作。包含文件拷贝、编译、打包三部分;完成这三部就可以得到一个可运行的程序包了。ANT的安装,环境变量的设置等省略。网上有很多文章。准备工作先创建一个简单的Java程序,这个程序输出简单的”Hello ANT!!!”。程序依赖于第三方Jar包GSON。基本的程序结构是这样的:原创 2017-12-15 17:03:50 · 1085 阅读 · 0 评论 -
使用Ant打包Web前台程序
概述本文通过一个简单的Web项目作为例子描述如何用ANT完成Web前台程序的打包工作。包含文件拷贝、编译、打包三部分;完成这三部就可以得到一个War了,放到Tomcat下就可以运行了。ANT的安装,环境变量的设置等省略。网上有很多文章。准备工作先创建一个简单的Web程序,这个程序通过一个简单的网页(index.html)显示”Hello ANT!!!”。程序依赖于第三方Jar包原创 2017-12-19 13:32:11 · 630 阅读 · 0 评论 -
打印Java异常堆栈信息
背景在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来)。这样方便后续定位问题。需要记录的运行时环境包含两部分内容:抛异常时的参数信息和函数调用堆栈。针对堆栈信息,如果直接调用Exception的getStackTrace方法获取将得到这样一句没用的信息:[Ljava.lang.StackTraceElemen原创 2017-12-26 15:35:35 · 11285 阅读 · 0 评论 -
Spring Boot初探之restful服务发布
一、背景Spring boot是集服务发布、数据库管理、日志管理等于一身的服务开发框架;是微服务开发的全能小帮手。这章讲述一下如何使用spring boot发布restful服务接口。二、搭建基础环境安装maven(指导文档 网上一搜一大堆)。在eclipse中创建maven项目。在pom.xml配置连接spring boot的仓库。依赖部分的配置如下: pa原创 2018-01-28 23:43:41 · 945 阅读 · 0 评论