首页 > 编程语言 > 详细

使用Kotlin注解实现springboot的Interceptor的api名字的MDC注入

时间:2021-06-10 11:37:17      阅读:29      评论:0      收藏:0      [点我收藏+]

Kotlin现在已经越来越普及了,其简单的语法使得程序员节省了大量的开发时间,前几天突发奇想,用kotlin实现了srpingboot项目的搭建,在实现MDClog的时候,因为想把api的名字注入到MDC里边,从而在ELK可以实现API名字的过滤,在写到interceptor的时候,遇到了一个坑,现分享一下

Springboot的controller实现

@RestController
@RequiredArgsConstructor
class TokenController(
    val tokenService: TokenService
) {
    @GetMapping(PathConstants.TOKEN_PATH)
    @EndPoint(apiName = "TOKEN")
    fun getToken(@RequestHeader(AUTHORIZATION_USER) user: String, @RequestHeader(AUTHORIZATION_PASSWORD) password: String) : TokenResponse {
        return tokenService.getToken(user, password)
    }
}

注意,这里的@EndPoint是自己的注解,用kotlin实现

EndPoint的代码实现

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class EndPoint(val apiName: String)

在Interceptor里截获endpoint,同时注入到MDC

@Component
class GenericInterceptor : HandlerInterceptor {

    @Throws(Exception::class)
    override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
        if (handler !is HandlerMethod) {
            Loggers.debug("Non-handlerMethod got: {}", handler.javaClass)
            return true
        }
        val endPoint = handler.getMethodAnnotation(EndPoint::class.java)
        if (endPoint == null) {
            Loggers.debug("Unknown end point")
            return true
        }
        MDC.put(API_NAME, endPoint.apiName)
        return true
    }
}

  

这里请注意,即使Java和Kotlin兼容,也不要使用Java的注解,比如:public @interface EndPoint,否则,该注解无法被Interceptor截获。

使用Kotlin注解实现springboot的Interceptor的api名字的MDC注入

原文:https://www.cnblogs.com/rakuten-anzhi/p/14869836.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!