2017-12-26 7 views

답변

1

로거 주석을 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으로 속성을 표시합니다.

+0

이것은 나를 위해 일했습니다! – hughjdavey