请教大家一个问题,我现在再用 jackson 的 writeValueAsString 作为 Log.基本上就是一股脑的
如果是 list ,那我就要
for(Item item: list){
log.info("[函数名] 信息: {}", mapper.writeValueAsString(item));
}
要么是 map 就,没办法这个 jackson 有个 checked exception 。。。必须这样处理。
map.forEach((key,value)->{
try{
log.info("[函数名] 信息: {}", mapper.writeValueAsString(item));
}catch(JsonProcessingException e){
throw new RuntimeException(e);
}
})
然后我就觉得很烦,也妨碍阅读。但没有 log 是不行的,aop 也不行,因为我不是想出入参 log ,是中间的某些重要变量也要 log ,但不重要的就不 log ,所以只能手动。
我主要就是想请教有没有大佬如何抽象出这个 map 的那个 tryCatch JsonProcessingException 那部分,只保留
log.info("[函数名] 信息: {}", mapper.writeValueAsString(item))
作为一个 consumer 。我试着自己写了,但是 consumer.accept 那里好像说不能处理 JsonProcessingException, 因为 consumer 自己是不抛出这个 exception 的。
意象之中希望是这样的
listFunc(list, ()->log.info("[函数名] list item: {}");)
还有就是
mapFunc(map, ()->log.info("[函数名] map key = {}, value = {}");)
或者大佬有没有好的见解让我看看如何打 log.
你可能觉得为什么不直接整个 list 进去一个 log:
log.info("[函数名], 信息: {}", mapper.writeValueAsString(list)).
一来就是方便阅读。另外就是怕这个 list 或者 map 里面的东西很多,以前试过用 toString 或者 Gson ,然后东西多的时候直接就 stackoverflow. 还有就是处理循环引用方面似乎也方便。
谢谢大家。
1
wangyu17455 2022-03-09 23:27:17 +08:00
|
2
Leviathann 2022-03-10 00:39:55 +08:00
公司的代码库里 JsonUtils 是直接 try return write catch return null..
|
3
corningsun 2022-03-10 09:53:21 +08:00
搞个全局静态函数 JsonUtils ,mapper 也提前初始化好。
public static String writeValueAsString(Object obj) { try{ return mapper.writeValueAsString(item); } catch(JsonProcessingException e){ throw new RuntimeException(e); } } 使用 log.info("[函数名] 信息: {}", JsonUtils.writeValueAsString(item)) |
4
golangLover OP |
5
nothingistrue 2022-03-10 13:56:38 +08:00
lombok 省事,但是这个是语法糖不是代码模板,用起来有争议。
可以考虑用包装方法把 checked exception 变成 unchecked exception 。例如: writeValueAsStringNonChecked(ObjectMapper mapper, Object object){ try { mapper.writeValueAsString(object); }catch(JsonProcessingException e){ throw new RuntimeException(e);// 用得多了还可以考虑定义一个专用异常 } } 这个方法放在哪里很自由,看你的工程规范。 |