美文网首页
Spring MVC 根据 controller 层方法入参和返

Spring MVC 根据 controller 层方法入参和返

作者: DJN_ | 来源:发表于2018-11-16 16:48 被阅读0次

    上一篇文章已经就如何获取到 controller 层方法的参数和返回值进行了详细分析,并且封装了 HandlerMethodPostProcessor 接口以便使用,接下来就实现业务需求:根据 controller 层方法的入参和返回值动态生成日志。

    实现日志解析

    实现思路是这样的:定义一个注解,注解的 value 为日志表达式,HandlerMethodPostProcessor#postProcessorAfterInvoke 方法中判断 HandlerMethod 是否使用了该注解,使用了就解析其日志表达式。

    日志需要根据参数和返回值动态生成,所以需要在日志表达式中提供一种方式能取到两者的值,这里提供两种实现方式:

    1. 自己定义参数和返回值的获取表达式,在 postProcessorAfterInvoke 方法中解析时再将其替换为具体值
    2. 使用 SpEL 表达式,需要将参数和返回值添加到 org.springframework.expression.spel.support.EvaluationContext中,并借助 SpEL 的 API 进行解析

    第一种方式需要自己解析日志表达式,比较复杂,所以我的实现里只是进行了简单的取值,也可以对参数和返回值的成员通过 getter 递归取值;SpEL 表达式提供了强大而完备的功能,可以进行算数运算,逻辑判断,也可以获取其他 bean、java 类、系统参数或项目参数,但对于简单的日志表达式可能不需要这么多的功能,可以按需使用两种方式。

    自定义日志表达式

    表达式的解析规则如下

    • {parName}: {} 内部的内容将被解析,普通单词将识别为参数名
    • {$}: $ 符将被认为返回值
    • {parName.count}: .count 的形式将调用参数 parName 的 getCount 获得其值
    • {parName.role.name}: .role.name 的形式将调用参数 parName 的 getRole,再继续调用 Role 的 getName
    • {$.name}: 调用返回值的相应 getter 方法

    可以像下面这样使用:


    image.png

    HandlerMethodPostProcessor#postProcessorAfterInvoke 解析时只需将 {} 部分替换为具体值即可。

    SpEL 解析日志

    SpEL 可以像如下方式进行使用:


    image.png

    解析时#$ 获取到的是方法返回值,#num 将被替换为参数 num 的值。

    代码说明

    image.png
    1. StandardEvaluationContext + SpelExpressionParser + TemplateParserContext 可以用来解析 SpEL 表达式定义的日志
    2. logExpressionParser.parse 方法将解析自定义的日志

    handleCustomLog 方法中就可以对日志进行具体的处理。

        private void handleCustomLog(String content, Object result, ServletInvocableHandlerMethod handlerMethod, Object[]
                args) {
        }
    

    完整代码已上传 GitHub,可以在 这里 找到

    相关文章

      网友评论

          本文标题:Spring MVC 根据 controller 层方法入参和返

          本文链接:https://www.haomeiwen.com/subject/cltmfqtx.html