log-record icon indicating copy to clipboard operation
log-record copied to clipboard

有一点小小的建议

Open kangarap opened this issue 3 years ago • 11 comments

作者你好,注解上的SpEL表达式执行顺序总是晚于被注解的整体方法执行的,有一种逻辑就会产生问题。 比如,有个方法是删除数据,参数只有一个ID,这种情况下需要通过id查到这条数据的信息,然后一起记录到日志。 但是现在的结果是,数据先被删除,然后SpEL函数去查数据时数据已经是null了。 看到您有个LogRecordContext的上下文,可以在方法体先查出来,但是这样子的话入侵太严重。 现在入参ID不变,不动入参,不能影响到前端。这种情况怎么处理比较好,后续会优化这种情况吗?

kangarap avatar Feb 09 '22 06:02 kangarap

感谢反馈,很好的一个场景,类似的问题我也碰到过。现在的逻辑,是在原函数执行后进行SpEL的解析的,主要是为了顺便把结果也一起处理了。现在思考下,感觉确实应该放在函数执行前解析会比较合适。晚点我抽空优化一下,如果有更新了在这里@你。

qqxx6661 avatar Feb 09 '22 07:02 qqxx6661

你要是急的话只能先用LogRecordContext临时撑一撑 :)

qqxx6661 avatar Feb 09 '22 07:02 qqxx6661

好的,作者有心了[抱拳]

kangarap avatar Feb 09 '22 07:02 kangarap

如果有的场景需要在执行前解析,有的场景需要在执行后再解析呢。

huxxx avatar Feb 10 '22 12:02 huxxx

如果有的场景需要在执行前解析,有的场景需要在执行后再解析呢。

其实是个权衡问题,目前来看碰到的业务场景,其实很多都和上方的case类似,要在执行前做解析,否则旧值得获取就只能靠手动传入。

当然,最完美的方案是把这个权利交给用户,给用户字段来配置,默认是在执行前解析。

qqxx6661 avatar Feb 10 '22 13:02 qqxx6661

作者你好,注解上的SpEL表达式执行顺序总是晚于被注解的整体方法执行的,有一种逻辑就会产生问题。 比如,有个方法是删除数据,参数只有一个ID,这种情况下需要通过id查到这条数据的信息,然后一起记录到日志。 但是现在的结果是,数据先被删除,然后SpEL函数去查数据时数据已经是null了。 看到您有个LogRecordContext的上下文,可以在方法体先查出来,但是这样子的话入侵太严重。 现在入参ID不变,不动入参,不能影响到前端。这种情况怎么处理比较好,后续会优化这种情况吗?

1.0.7 正式版本已经将解析前置到了函数执行前,之后考虑可以用户自定义前后,你可以试试了

qqxx6661 avatar Feb 12 '22 08:02 qqxx6661

@qqxx6661 嗯嗯,辛苦了!

kangarap avatar Feb 14 '22 05:02 kangarap

美团的框架也提出了同样的ISSUE

建议:@ LogRecordAnnotation里只有函数放到整体方法执行之前执行,适应以下场景

https://github.com/mouzt/mzt-biz-log/issues/17

qqxx6661 avatar Feb 14 '22 13:02 qqxx6661

v1.1.0版本支持自定义切面执行时机(方法执行前,方法执行后),默认方法执行后,可在每条注解上单独控制。

qqxx6661 avatar Apr 23 '22 10:04 qqxx6661

以下从README摘录:

在默认配置下,注解切面的逻辑在方法执行之后才会执行,这样会带来一个问题,如果在方法内部修改了方法参数,SpEL解析后取值就变成了改变后的值。

可以使用LogRecordContext写入旧值,避免这个问题,只是有一定代码侵入性。

为了满足一些特殊需求,注解中提供boolean参数executeBeforeFunc,若设置为true,则会在方法执行前先解析SpEL参数。 这样也会带来负作用,方法内写入的数值,比如自定义上下文,就不再参与SpEL解析了。

qqxx6661 avatar Apr 23 '22 10:04 qqxx6661

@huxxx @kangarap

qqxx6661 avatar Apr 23 '22 10:04 qqxx6661