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