0
Kotlin은 기존 라이브러리 Lombok과 같이 컴파일 타임에 주석을 삽입 할 수 없습니다. 런타임시 스프링 프레임 워크에 대한 주석을 삽입하는 데 알맞은 방법이 있습니까?Kotlin을 사용한 스프링 용 주석 주입
Kotlin은 기존 라이브러리 Lombok과 같이 컴파일 타임에 주석을 삽입 할 수 없습니다. 런타임시 스프링 프레임 워크에 대한 주석을 삽입하는 데 알맞은 방법이 있습니까?Kotlin을 사용한 스프링 용 주석 주입
로거 주석을 Spring 애플리케이션에 삽입하려고한다고 가정합니다. Log.kt 런타임에
package com.example.util
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD)
@MustBeDocumented
annotation class Log
이 클래스 분사 주석 : 여기
이 주석 클래스 예제 GreetingController : LogInjector.kt 다음package com.example.util
import org.slf4j.LoggerFactory
import org.springframework.beans.BeansException
import org.springframework.beans.factory.config.BeanPostProcessor
import org.springframework.stereotype.Component
import org.springframework.util.ReflectionUtils
import java.lang.reflect.Field
@Component
class LogInjector: BeanPostProcessor {
@Throws(BeansException::class)
override fun postProcessAfterInitialization(bean: Any, beanName: String): Any {
return bean
}
@Throws(BeansException::class)
override fun postProcessBeforeInitialization(bean: Any, name: String): Any {
ReflectionUtils.doWithFields(bean.javaClass,
@Throws(IllegalArgumentException::class, IllegalAccessException::class) { field: Field ->
// SAM conversion for Java interface
ReflectionUtils.makeAccessible(field)
if (field.getAnnotation(Log::class.java) != null) {
val log = LoggerFactory.getLogger(bean.javaClass)
field.set(bean, log)
}
}
)
return bean
}
}
,이 클래스는 @Log
주석을 사용 .kt
package com.example.web
import org.slf4j.Logger
import org.springframework.web.bind.annotation.*
@RestController
class GreetingController {
@Log lateinit private var logger: Logger
@RequestMapping("/greeting")
fun greeting(): String {
logger.info("Greeting endpoint was called")
return "Hello"
}
}
logger?.info('...')
과 같이 null 로깅 호출을 피하기 위해이 예제는 the late-initialized modifier으로 속성을 표시합니다.
이것은 나를 위해 일했습니다! – hughjdavey