
请教大家一个问题,我现在再用 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 Mar 9, 2022 |
2 Leviathann Mar 10, 2022 公司的代码库里 JsonUtils 是直接 try return write catch return null.. |
3 corningsun Mar 10, 2022 搞个全局静态函数 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 Mar 10, 2022 lombok 省事,但是这个是语法糖不是代码模板,用起来有争议。 可以考虑用包装方法把 checked exception 变成 unchecked exception 。例如: writeValueAsStringNonChecked(ObjectMapper mapper, Object object){ try { mapper.writeValueAsString(object); }catch(JsonProcessingException e){ throw new RuntimeException(e);// 用得多了还可以考虑定义一个专用异常 } } 这个方法放在哪里很自由,看你的工程规范。 |