Ykuri98
文章46
标签14
分类1
工作中的一些小问题(持续更新)

工作中的一些小问题(持续更新)

Could not resolve placeholder ‘xxx’ in value “${xxx}”

工作时出现了好几次这个问题,需要记录一下解决思路和方法。

出现这种问题的根源都是配置文件下的这个配置无法正确识别,要么就是最简单的:配置文件里压根没这配置,而自己却使用了;要么就是配置文件本身就无法被识别了。

为什么会无法识别配置文件?最可能的问题是字符集不符合,一旦配置文件内出现中文,无论是不是注释,都会在maven编译后报错的日志中找到这么一句话

1
org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1

说明了yaml文件由于字符集不是utf8而不能被正确识别。

这时就要检查自己的配置文件是不是utf8字符集了,如果是本地文件需要用文本文件打开查看;如果是nacos上的配置,那默认就是utf8,说明项目自身编译配置文件时用的不是utf8字符集。

解决方法也很简单,在maven下的<properties>标签增加一个

1
<argLine>-Dfile.encoding=UTF-8</argLine>

说明编译时需要用utf8编译即可。

try/catch和for循环的内外关系

同事问了我一个问题:在try/catch下的for循环发生异常后,会不会跳出循环?

我愣了一下,之前好像没有考虑过这个问题,当时回答是会跳出的,当然正确答案我也不能确定。

正好在知乎刷到了这个问题的正确解答,在这里记录一下。

  1. 在try/catch下的for循环,发生异常会跳出并终止循环。
  2. 在for循环下的try/catch,发生异常会报出异常,但不会终止循环。

记一次Oracle update更新的回滚

早上模模糊糊的,想执行一个插入的语句,没成想写成update了,一下把表里所有数据都更新了,给我吓出一身冷汗…好险是公司的测试环境,不然今天我就拿东西滚蛋了。

大致查了一下怎么恢复,得知了Oracle具有快照的功能,会存储一段时间内的数据,只需要执行如下语句就可以查看。

1
select * from table_name as of timestamp to_timestamp('2022-07-26 17:20:00', 'yyyy-mm-dd hh24:mi:ss');

其中table_name是需要回滚的表,时间填要回滚的时间即可。

然后开启表的闪回功能

1
alter table table_name enable row movement;

最后修改表

1
flashback table table_name to timestamp to_timestamp('2022-07-26 17:20:51','yyyy-mm-dd hh24:mi:ss');

只能说以后要引以为戒…

记一个service bean为空的bug

调接口发现报空指针,本地debug才发现报空指针的是service bean,可是其他使用该service的接口都可以正常使用,service也加了@Autowired注解,有点百思不得其解了。后面查询了https://ask.csdn.net/questions/7615814的回答,发现接口方法写成private了...说明private会影响service bean的注入,以后可不能再手快了…

Maven字符集相关问题

今天好不容易写完bug代码,准备打包发测试的时候发现打包失败了,还是第一次遇到这种情况,看了一下错误日志,说明nacos中的配置文件并没有被解析到,导致读取不到配置文件中的常量,上网搜了一下,初步猜测是字符集的问题,首先确认nacos中的字符集,查了一下就知道,nacos中的配置文件字符集默认都是utf-8

那么只能是本地字符集的问题了,在idea的设置中将所有文件都改为utf-8,继续跑package,结果还是失败…

maven打包失败后会在target中放一个错误日志,查看日志发现了一个更重要的错误。

1
java.nio.charset.MalformedInputException: Input length = 1

这个错误说明maven打包时使用的字符集与配置文件的字符集不相符,导致不能正常读取。

在网上找了各种方法,给pom文件加了各种配置,都没能有效解决…

最后看到了一篇博客https://blog.csdn.net/m0_46897923/article/details/116236929,里面禁用了maven的test,这样在打包时会自动跳过test从而打包成功。虽然解决问题了,但并不完美,如何修改maven运行时的字符集才是重点。

根据这个思路继续查,查到博客https://blog.csdn.net/usrnck0709/article/details/124945862,这里给出了四个比较具体的方案,其中我采用的是最后一种,在pom文件中添加

1
2
3
<properties>
<argLine>-Dfile.encoding=UTF-8</argLine>
</properties>

即在运行maven时确认字符集为utf-8

查数据库锁表语句,杀锁表进程

1
2
3
4
5
6
7
8
9
-- 查数据库锁表语句,杀锁表进程
select sess.sid,sess.serial#, lo.oracle_username,lo.os_user_name,
ao.object_name,lo.locked_mode from v$locked_object lo,dba_objects ao,v$session sess
where ao.object_id=lo.object_id and lo.session_id=sess.sid;

-- #参数分别是sid, serial#
alter system kill session '603,3';
-- 如果杀不掉,用
alter system kill session '2724,43721' immediate ;

部署命令

1
2
3
4
5
6
# 抓取进程ID
ps -ef | grep xxx
# 根据进程ID杀死进程
sudo kill -9 xxx
# 启动jar包
nohup sudo java -Xms512m -Xmx1024m -jar xxx.jar >> ./nohup.out 2>&1
本文作者:Ykuri98
本文链接:https://ykuri98.github.io/2023/09/01/%E5%B7%A5%E4%BD%9C%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E9%97%AE%E9%A2%98%EF%BC%88%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%EF%BC%89/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×