Spring boot aop советы не получают триггер при использовании kotlin - PullRequest
0 голосов
/ 09 ноября 2018

Я пытался настроить аспект для ведения журнала, но он вообще не работает, я использую 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 голосов
/ 09 ноября 2018

Есть несколько вещей, которые могут быть здесь не правы, но в целом Spring AOP работает в Котлине. Я использовал очень похожий аспект в проектах Java и Kotlin, и он работает одинаково в любом из них.

Одна вещь, которую нужно помнить, Spring AOP основан на прокси , поэтому он может только рекомендовать не финал , public методы Spring beans , которые не вызываются из бина ( нет самовозбуждения ).

Для проекта Kotlin вы можете использовать плагин компилятора allopen, чтобы классы и методы открывались по умолчанию.

Репозитории данных Spring обычно не снабжены @Repository, но обычно выходят из подчиненного интерфейса org.springframework.data.repository.Repository. Таким образом, ваш pointcut хранилища не будет работать. Попробуйте вместо этого:

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

При этом вы сможете регистрировать фактические вызовы методов SimpleJpaRepository (реализация репозитория Spring Data по умолчанию).

У вас есть опечатка в вашем @Around, сочетания клавиш сочетаются с &&, а не &. В любом случае, я бы попробовал сначала без pointcut пакета, чтобы посмотреть, работает ли pointcut bean.

...