czp's blog

Telegram-Bot收不到普通群聊消息的问题

当我们写好一个 Telegram Bot 之后, 把它拉到一个群里, 然后在群里发一条命令, 机器人马上就收到了命令.

但是我们在群里发送一个普通消息(不以 / 开头的消息), 我们发现机器人没有收到这条消息.

我们私聊机器人, 机器人是能收到消息的. 换一个群, 依然收不到普通群聊消息, 但是能收到群里发的命令(命令一定是以 / 开头的).

这个问题是由于 Telegram Botprivacy 设置问题导致的. 详见 https://core.telegram.org/bots#privacy-mode

更改 privacy mode 非常简单, 首先我们联系 BotFather https://telegram.me/BotFather

Read More

Spring-Boot无法加载ClasspathResource问题

环境: Spring Boot 2.0.5.RELEASE

一般来说, 程序运行所必须的资源文件我们会一起打包到 jar. 那么接下去我们就要读取这个资源文件.

假定我们的资源文件在源码目录中为 src/main/resources/myFile.txt

Spring Boot 中读取存放在 classpath 的资源文件通常是这么做的

1
val myFile = ClasspathResource("/myFile.txt")

Read More

正确打包Spring-Boot到war

环境: Spring-Boot 2.0.5.RELEASE | gradle 4.10.2

众所周知, Spring Boot 在开发时之所以能直接启动, 是因为内置了 tomcat. 同时这也使得 Spring Boot 可以直接输出为可执行的 jar 文件.

那么问题来了, 如果我们需要将应用打包为 war 文件并部署到外部的 tomcat 服务器怎么办.

在 Google 搜索这个问题, 就会看到很多人跟你说, 在 gradle 里, 把 tomcat 的依赖 exclude 掉就好了. 但是这样的话, 本地调试就没法直接启动了, 既然 Spring Boot 的设计是完美的, 所以肯定不是这么弄的.

于是我们找到了 Spring Boot 文档 https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/html/#packaging-executable-wars

Read More

在Spring-Boot中正确注册Jackson-Module

环境: spring-boot 2.0.5.RELEASE

当我们在进行 Spring Boot 开发时, REST 接口的默认返回类型是 json, 使用的序列化库为 jackson.

Spring Boot 内部使用的 ObjectMapper 是在 MappingJackson2HttpMessageConverter 里被配置好的. 于是问题就来了, 我们想要使用更多的 Jackson Module 怎么办.

默认被配置的 Jackson ModuleJdk8Module, JavaTimeModule, JodaModule, KotlinModule. 这些 Module 是在哪里被注册的呢, 通过搜索大法, 我们发现是在这里 org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.configure(ObjectMapper objectMapper)

1
2
3
4
5
6
7
8
9
10
Assert.notNull(objectMapper, "ObjectMapper must not be null");

if (this.findModulesViaServiceLoader) {
objectMapper.registerModules(ObjectMapper.findModules(this.moduleClassLoader));
}
else if (this.findWellKnownModules) {
registerWellKnownModulesIfAvailable(objectMapper);
}

...

Read More

Spring-Boot-Jpa使用Google-Cloud-SQL

环境: Spring-Boot-Data-Jpa 2.0.5.RELEASE

编写使用 Google Cloud SQL 的应用时, 我们会发现一个问题. 当我们连接 Cloud SQL 时, 我们必须先知道 Cloud SQLIP, 同时还要到 Google Cloud Console 给自己的应用所部署的服务器加数据库白名单(如果是部署在同一项目下的 APP Engine 或者 Compute Engine 默认就有白名单).

一个应用还可以操作一下, 如果写的是微服务, 有几十个应用, 那简直是浑身爆炸.

于是我们想到, 有没有这么一种库, 可以帮我们自动寻找所需的 Cloud SQL 的真实地址并且自动完成身份验证呢.

秉承 ‘不写任何代码’ 的光荣传统, 我们找到了这个库 https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-starters/spring-cloud-gcp-starter-sql-mysql

Read More