李晨亮的博客

IT技术男,恋技术,爱运动


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

  • 留言

为 Spring Boot 增加启动类包外的 Bean、Mapper 路径

发表于 2019-02-21 | 分类于 后端 , Java | | 阅读次数:

背景

最近在个项目里使用了人人开源项目 renren-fast | Java 快速开发平台。

为了让项目的包结构清晰整洁、代码维护容易,就创建了 top.lichenliang.santa 这个包,项目中的所有模块的实现都放到这个包中。

熟悉 Spring Boot 的都知道,Spring Boot 项目启动时默认只扫描有注释 @SpringBootApplication 这个类所在包下的类和子包。

配置方式

除了需要为 Spring Boot 配置要扫描的包外,还需要为 MyBatis 手动配置 Mapper 的路径。

下面就是配置就是如何才能增加另外的项目包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class} , scanBasePackages={"io.renren","top.lichenliang.santa"})
@MapperScan({"io.renren.**.dao" , "top.lichenliang.santa.**.dao"})
@Import({DynamicDataSourceConfig.class})
public class RenrenApplication extends SpringBootServletInitializer {

public static void main(String[] args) {
SpringApplication.run(RenrenApplication.class, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(RenrenApplication.class);
}

}

此代码由阿伟提供 :)

在 Keep 的动态中复制文字

发表于 2019-02-18 | 分类于 生活 , 爱好 , 跑步 | | 阅读次数:

玩 Keep app 的小伙伴们,都是运动达人!

经常都会把自己的运动发布到动态中分享给K友们。

还经常会把在 Keep 里发布的动态再分享到朋友圈或是微博什么的。

或者再 Keep 里分享出去的还不够个性。

自己手动发微信朋友圈。

可有个问题不知道小伙伴们遇到过没有。那就是在 Keep 里发布完动态后,无法复制动态中的文字。

要是少的话还好,大不了再打一遍呗,可有一次我打了好几百字,要是再打一遍简直就心碎了。

这里我告诉大家个小技巧。

把已经发布了的动态再分享出去,这个应该都会。

平时常用的就是分享到微信、朋友圈、微博什么的。

你需要做的是选择分享到短信,这时会调用其短信功能,并把分享的内容复制到了短信的输入框中,注意这里面的内容里含有个网址,把这个网址复制下,粘贴到手机的浏览器的地址栏中并回车(有的叫前往,反正就是用浏览器打开这个网址),这时动态就在浏览器中显示了。下面只需要在动态的文字上按住一小会儿,就出现文字选择、复制的光标和按钮了。

2019 哈尔滨高校跑

发表于 2019-02-18 | 分类于 生活 , 爱好 , 跑步 | | 阅读次数:

起源

2018年末的某一天,早上依然忙忙碌碌,洗漱、整孩子起床、吃早饭、送孩子。路上依然很堵,听着龙广“PS早安秀”,两个半疯的主持人依然叨叨着,说了个话题:“你2018做了哪些感觉有意义的事”。我顺着这个话题想了下,真没想出来什么有意义的事。不对,有个事算是吧。那就是跑了1年的步,还参加2018哈尔滨国际马拉松的半马。

收获

这一年的跑步,身体状态恢复和很多,从呼哧带喘得跑3Km,到可以坚持跑半马。体重从80Kg减到73Kg(最轻的时候,冬天又涨回去2Kg)。全年没有超过两天的感冒,有几次觉得身体不适,吃几遍感冒胶囊,喝碗热姜汤发发汗就挺过去了。当然,还有精神状态,身体状态都不一样了,也有效的抑制抑郁。

继续

这里叫继续,而没有叫坚持,因为我感觉用“坚持”这个词说的事都特别难。另外也比较不愿意说每天要怎么怎么样。因为“每”也是很难做到的,别说每天了,就算是能做到每周都怎么样,我感觉都会很难,除非提前做好些准备,即便是有什么情况影响了,也能给留出足够时间去应付意外情况的影响。

趣味

既然想继续下去,那么就立个flag吧。其实呢,这也没什么意义,我还是比较随性的。因为生活、工作已经把我们绑架的不得了,为什么做点自己喜欢的事,还有那么的有板有眼,有那么多强制的要求呢。倒不如说是趣味,因为跑步嘛,就是跑跑跑跑跑。。。这过程中只有对自己的信念、意志、身体、技巧的磨练。总在一个地方实在是太无趣了。我比较喜欢探索,喜欢去没有去过的地方,或者已经很久没有去过的地方看看,周游世界没那条件,国内游、省内游也没时间。搞了这么多年的技术,说不上是什么学者,但的确是个搞技术工程师和理工男,对技术、学术是有着憧憬和向往的。基于上面这两点,打算19年把哈尔滨的高校都跑一遍。

在教育部的网站上我找到了全国高等学校名单,在哈尔滨的高校有51个。如果每个周跑一个的话,需要12.75个月,一年都不够啊,19年肯定搞不完。那就来个第一季吧,先撸完一表院校!

第一季:一表院校

序号 学校名称 性质排名 省份排名 分类 分类排名 女生比例 完跑时间
1 哈尔滨工业大学 21 1 理工 6 14% 2019-02-24
2 哈尔滨工程大学 57 2 理工 23 25% 2019-03-03
3 东北林业大学 101 4 农林 7 40% 2019-03-24
4 黑龙江大学 122 5 综合 44 47% 待跑
5 东北农业大学 131 6 农林 8 45% 待跑
6 哈尔滨医科大学 139 7 医科 7 63% 待跑
7 哈尔滨理工大学 174 8 理工 55 33% 待跑
8 哈尔滨师范大学 191 9 师范 24 63% 待跑
9 黑龙江中医药大学 236 11 医科 22 75% 待跑
10 哈尔滨商业大学 279 12 财经 21 55% 待跑
11 黑龙江科技大学 344 15 理工 121 36% 待跑
12 黑龙江工程学院 393 17 理工 136 30% 待跑

上表来自:黑龙江省一本大学有哪些 2018最新一本高校名单

跑步经历

发表于 2019-02-18 | 分类于 生活 , 爱好 , 跑步 | | 阅读次数:

这次是个观光溜儿,从白天到黑夜!请忽视配速和距离,这个路线是跑友跑过的,没细问我也试了下,才知道这是个有内涵和充满凶险的路线。从江北往江南方向,走公路大桥,过了冰雪大世界一段后,就没有人能走的路了(道牙子上面和桥的护栏只有大概和肩那么宽走路都费劲),更别说跑步了,旁边还有飞驰而过的各种车,盼着到了桥头下了桥有个人有的地方,可到了公路大桥桥头,以为能下去,NND还是没有能下去的地方。最可怕的是过了桥头之后就是往友谊西路去的匝道了,这一段连道牙子都没有,只能下到马路上,这的车速还很快。根据空气动力学原理,空气流动快的面比空气流动慢面压力小,用普通话来说就是身体会被推向高速过车的那侧。相比前面说的,阳明滩大桥上的还算不错,起码有个一米左右宽的路能走,只是十来米就有个弱电井盖,蹦蹦跳跳的才能过!

Enterprise Architect 中无法删除选择的包

发表于 2019-02-14 | 分类于 建模 , 工具 | | 阅读次数:

EA项目环境说明:EA工程文件是已受SVN版本控制的。

在 Project Browser A包右键依次点击 Package Control -> Check Out 后,想删除A包下面的B包。在B包上右键点击,在右键菜单中点击Delete 'B'后的提示,如下图:

“基础信息管理” 包被 Check Out 了!

如果你也遇到这个问题,请依次检查B包下的已经被 Check Out 出来的包(没有🔒图标的包),把找到的包 Check In 之后就可以删除 B 包了。也可以直接把 B 包 Check In Branch... 后,再删除 B 包。

比较标准的说法就是:要删除已经被版本控制的包时,此包与此包下的子包都不能是 Check Out 的状态。

在 Enterprise Architect 中画 Visio 的基本框图

发表于 2019-02-08 | 分类于 建模 , 工具 | | 阅读次数:

有的时候我们想画画框图用 Visio 是很方便的。可在 Enterprise Architect(后面简称为 EA )中用什么图画框图比较好呢。有的说用对象图、流程图都可以。我看了下后感觉里面的图形元素和 Visio 框图中的形状还是差了不少。

我就不信 EA 里面连方块、三角、圆都没有!有严重强迫症的我几乎把 EA 中所有的图都看了一遍,终于找个比较接近 Visio 基本框中图形状的图。那就是白板图!!!

创建白板图

  1. 打开 New Diagram 窗口(注意:不能在 Root Note 下创建图,需要选择个包后才能创建图)

  1. 在 New Diagram 窗口中找到白板图

  1. 选择白板图或手绘图(随便选什么都行,在图属性中可以随意切换)

白板图属性

白板图除了基本的图属性为,还有两个特殊的属性,分别是“手绘”和“白板”

  • 手绘:勾选后图中的元素线条会呈现出手绘的效果。
  • 白板:勾选后图的背景变为白色,并且图中所有形状的填充色都将显示为白色。

EA 白板图属性面板

图元素

工具盒(Toolbox)

EA 白板图的形状、箭头、连线

形状(Shapes)

EA 白板图形状示例

注意到上图中有个与众不同的形状了吗?

那个就是图中的 Oval1 ,这个形状有两个不同之处:

  1. 显示出了形状的名称;
  2. 不是透明的,有填充色。

在白板图中的形状(Shapes)和箭头(Arrows)有两个通用的属性 fill 和 nameVisible ,分别用来控制是否填充和元素名称的显示,默认都为 false,如下图:

EA 白板图形状属性

注:上面的这两个属性不包括形状中的 Callout 和 Text Element

Thin Arrows & Lines

由于 Thin Arrows 和 Lines 元素都比较简单,这里就不在讲述了,自己去探索吧。

了解边界(Boundary)

发表于 2019-02-07 | | 阅读次数:

什么是边界(Boundary)

边界元素源自用例中的系统边界,但它可以广泛的用在其他地方,用来描述系统或系统中一部分的与其外部环境间的分离方式。可以将任意数量的边界添加到图表中,并且可以将其他元素(例如:用例,特征,需求,组件等)放置在边界内。可以改变边界的属性以显示组织成垂直和水平泳道的多个隔室。边界的边框样式和不透明度也可以设置。

什么地方可以找到边界

UML Elements Toolbar | Boundary
Common Toolbox Page | Boundary

边界的用法

边界元素对于定义系统内部(或系统的一部分)以及外部内容特别有用。它可用于显示系统或子系统的用例范围内的功能或要求。为管理和非技术受众创建的图表将受益于边界的使用,边界可以着色和嵌套,具有视觉吸引力和商业意义。它本质上是一个图解设备,所以不会出现在项目浏览器中。如果需要正式和结构化的元素分组,建模者可以考虑使用包。

边界选项

边界可以设置为有多个垂直和水平泳道,这对于将元素分组到边界的不同部分非常有用,从而创建矩阵效果。边框样式也可以配置为允许使用标准元素外观设置进行着色的不同线条样式。此外,选择“实心”选项可以设置边界的填充颜色。

升级到 Tomcat 8 后 Cookie 可能出现的问题

发表于 2018-10-18 | 分类于 后端 | | 阅读次数:

问题场景

之前运行在 Tomcat 7 中的 Web 项目,当把 Tomcat 从 7 升级到 8.x 及更高版本后,用户登录失败,后台报异常:

1
2
3
4
java.lang.IllegalArgumentException: An invalid character [xx] was present in the Cookie value
at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateCookieValue(Rfc6265CookieProcessor.java:162)
at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:111)
...

规范变化

Tomcat 8.x( or later)版本进了很多改进,其中的 Cookie 处理也升级到 RFC6265 规范,这可能导致在 Tomcat 8 以前版本中运行无问题的Web项目在 Tomcat 8 中报下面错误:

java.lang.IllegalArgumentException: An invalid character [34] was present in the Cookie value

上面的 [34] 中的 34 是指 ASCII 码(十进制)对应的字符 “(双引号)。那么在不明确知道 RFC6265 规范中 Cookie 值可用的字符时,可能在 Cookie 值使用其他字符也会出现上面的问题。

那么下面就来看看到底哪些字符时不可用的。

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void validateCookieValue(String value) {
int start = 0;
int end = value.length();

if (end > 1 && value.charAt(0) == '"' && value.charAt(end - 1) == '"') {
start = 1;
end--;
}

char[] chars = value.toCharArray();
for (int i = start; i < end; i++) {
char c = chars[i];
if (c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f) {
throw new IllegalArgumentException(sm.getString(
"rfc6265CookieProcessor.invalidCharInValue", Integer.toString(c)));
}
}
}

Rfc6265CookieProcessor.validateCookieValue 源码地址

通过上面这段源码分析出 RFC6265 规范中 Cookie 值不可用的字符串,见下表:

十进制 十六进制 缩写/字符 解释
34 0x22 “ 双引号
44 0x2C , 逗号
59 0x3B ; 分号
92 0x5C \ 反斜杠
127 0x7f DEL (delete) 删除(控制字符)
< 33 < 0x21 略 控制字符/通信专用字符/空格

问题原因

Tomcat 8 更换默认的 CookieProcessor 实现为 Rfc6265CookieProcessor ,之前的实现为 LegacyCookieProcessor 。前者是基于 RFC6265 ,而后者基于 RFC6265、RFC2109、RFC2616 。

解决方式

独立的 Tomcat

修改配置文件 context.xml ,指定 CookieProcessor 为 org.apache.tomcat.util.http.LegacyCookieProcessor,具体配置如下:

1
2
3
<Context>
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
</Context>

SpringBoot 内嵌 Tomcat 的解决方式

在 springboot 启动类中增加内嵌 Tomcat 的配置 Bean,如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@SpringBootApplication
public class Application extends SpringBootServletInitializer {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

// Tomcat Cookie 处理配置 Bean
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() {
return (factory) -> factory.addContextCustomizers(
(context) -> context.setCookieProcessor(new LegacyCookieProcessor()));
}
}

参考资料:

Tomcat 8 CookieProcessor 实现变化
百度百科 ASCII

Python Web 抓取框架 Scrapy

发表于 2018-02-27 | 分类于 随笔 | | 阅读次数:

安装 Python

安装 Scrapy

pip install scrapy

安装 Twisted( Scrapy的运行时依赖)

下载Twisted

打开网页:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 搜索 Twisted ,找到 Twisted 的列表 文件名中的cp后面是python版本,amd64代表64位,下载对应的版本 运行下面的安装命令

pip install 下载路径/Twisted-17.5.0-cp36-cp36m-win_amd64.whl

安装 pywin32 (Scrapy在windows上运行的API依赖)

我下载的是 https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/ 页面中的 pywin32-221.win32-py3.6.exe 支持 win 32 python 3.6 版本 此项目已经迁移到GitHub,最新的版本在 https://github.com/mhammond/pywin32/releases 中

公众号模板消息 invalid weapp pagepath

发表于 2018-02-24 | 分类于 公众号 | | 阅读次数:

当你在使用公众号的模板消息API发送消息并且想可以通过这个消息跳转到小程序上,那么你可要注意了!很有可能踩了官方文档的参数名错误的坑!!! 在官方文档“发送模板消息”章节中无论是POST数据说明还是参数说明中都明确的说明

pagepath :所需跳转到小程序的具体页面路径

可你在信心满满的遵照文档中的说明开发完后,调用接口却出现了下面这个错误提示(真操蛋) 调用接口后返回:

{
“errcode”: 40165,
“errmsg”: “invalid weapp pagepath hint: [7GyI8a0145ge21]“
}

这个时候你可能还以为没什么,仔细看看自己是不是搞错了什么。 可你忙活了半天,没发现什么问题,这个时间你可能就要对 pagepath 的值去开刀了。 可你又忙活了半天,还是不知道是怎么回事。 有反复的看了看文档,确认自己没写错什么参数。 此时仍然毫无头绪,烦躁由心而生… 我也是这么过来的 :( 那么到底是什么问题??? 是官方文档写错了(;´д`)ゞ,我是瞎蒙出来的正确参数名,那是真崩溃啊。 把“所需跳转到小程序的具体页面路径”的参数名由文档中的 pagepath,改为 path 吧!!! 就是这样。

123

李晨亮

这里记录着我的原创技术文章、读书心得、学习经历、开源项目、工作经历

28 日志
24 分类
44 标签
RSS
GitHub
© 2019 李晨亮
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
黑ICP备18000883号-1