繁体   English   中英

SpringBoot AOP + Kotlin:带有目标 class 和 Aspectj 的注释不起作用

[英]SpringBoot AOP + Kotlin: Annotation with target class and Aspectj does not work

我正在尝试创建一个方面 class ,它使用 after 或 before 类型的方法,找到目标 class 注释并在实例化时打印文本但它不起作用。

注解

package com.example.demo

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class AutoGenerateCode()

方面

package com.example.demo

import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.springframework.stereotype.Component

@Aspect
@Component
class AutoGenerateCodeAspect {

    @Before("@annotation(AutoGenerateCode)")
    fun before(joinPoint: JoinPoint) {
        println("\n\nBEFORE\n\n")
    }
}

Dto class

package com.example.demo

@AutoGenerateCode
class FakeDto {
    val id = ""
}

主要的

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.EnableAspectJAutoProxy

@SpringBootApplication(scanBasePackages = ["com.example"])
@EnableAspectJAutoProxy
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
    val fakeDto = FakeDto()
    println(fakeDto)
}

这会打印 FakeDto class 的 object,但不会打印消息“BEFORE”

版本:

  • JAVA:11
  • 弹簧启动:2.4.1
  • Kotlin:1.4.21

请帮忙

它不起作用的原因有两个:

  • FakeDto - 在您的情况下Spring管理,因此Spring AOP没有机会拦截对FakeDto的调用(您可能需要使用 LTW)
  • @annotation切入点指示符适用于方法具有给定注释的方法执行 - 在您的情况下,该方法是toString并且它显然没有@AutoGenerateCode注释

亚历山大这里阐明了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM