上一篇文章已经就如何获取到 controller 层方法的参数和返回值进行了详细分析,并且封装了 HandlerMethodPostProcessor
接口以便使用,接下来就实现业务需求:根据 controller 层方法的入参和返回值动态生成日志。
实现日志解析
实现思路是这样的:定义一个注解,注解的 value 为日志表达式,HandlerMethodPostProcessor#postProcessorAfterInvoke
方法中判断 HandlerMethod 是否使用了该注解,使用了就解析其日志表达式。
日志需要根据参数和返回值动态生成,所以需要在日志表达式中提供一种方式能取到两者的值,这里提供两种实现方式:
- 自己定义参数和返回值的获取表达式,在
postProcessorAfterInvoke
方法中解析时再将其替换为具体值 - 使用 SpEL 表达式,需要将参数和返回值添加到
org.springframework.expression.spel.support.EvaluationContext
中,并借助 SpEL 的 API 进行解析
第一种方式需要自己解析日志表达式,比较复杂,所以我的实现里只是进行了简单的取值,也可以对参数和返回值的成员通过 getter 递归取值;SpEL 表达式提供了强大而完备的功能,可以进行算数运算,逻辑判断,也可以获取其他 bean、java 类、系统参数或项目参数,但对于简单的日志表达式可能不需要这么多的功能,可以按需使用两种方式。
自定义日志表达式
表达式的解析规则如下