使用Kotlin

时间:2018-11-09 17:02:30

标签: spring-boot kotlin spring-aop

我一直在尝试配置方面以进行日志记录,但是它根本无法正常工作,我正在使用kotlin和Spring boot,我已经在配置中使用注释添加了启用的AspectJ,但仍然无法正常工作。

@Aspect
@Component
class LoggingAspect {

    private val log = LoggerFactory.getLogger(this.javaClass)
    @Pointcut("within(@org.springframework.stereotype.Repository *)" +
            " || within(@org.springframework.stereotype.Service *)")
    fun springBeanPointcut() {
    }


    @Pointcut("within(com.xxxxx.backendcommon.domain.repository..*)" +
            " || within(com.xxxxx.backendcommon.service..*)")
    fun applicationPackagePointcut() {
    }
    @Around(value = "applicationPackagePointcut() & springBeanPointcut()")
    @Throws(Throwable::class)
    fun around(joinPoint: ProceedingJoinPoint): Any {
        log.debug("Enter: {}.{}() with argument[s] = {}", joinPoint.signature.declaringTypeName,
                joinPoint.signature.name, Arrays.toString(joinPoint.args))
        val result = joinPoint.proceed()
        log.debug("Exit: {}.{}() with result = {}", joinPoint.signature.declaringTypeName,
                joinPoint.signature.name, result)
        return result
    }
}

1 个答案:

答案 0 :(得分:0)

有些事情在这里可能是错误的,但总的来说,Spring AOP在Kotlin中工作。我在Java和Kotlin项目中使用了非常相似的方面,并且在两个方面的工作都相同。

要记住的一件事,Spring AOP is proxy-based,因此它只能建议 Spring Bean 非最终 public 方法不会从Bean内调用(无自调用)。

对于Kotlin项目,您可能需要使用allopen编译器插件来默认打开类和方法。

Spring数据存储库通常不使用@Repository进行注释,而是通常从org.springframework.data.repository.Repository的子接口扩展。因此,您的存储库切入点将不起作用。尝试以下方法:

 @Pointcut("within(org.springframework.data.repository.Repository+)")
 fun withinRepository() {}

使用此方法,您应该能够记录SimpleJpaRepository的实际方法调用(默认的Spring Data存储库实现)。

您的@Around中有一个错字,切入点与&&而不是&组合在一起。无论如何,我会在没有包切入点的情况下尝试使用它,以查看bean切入点是否正常工作。