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