expackJ和kotlin-注入春季服务


@Aspect
@Component
class ExceptionAspect(private val mailSenderServiceImpl: MailSenderServiceImpl)
{
    @AfterThrowing(pointcut = "execution(* myproject.mail..*(..))", throwing = "throwable")
    fun sendError(throwable: Throwable)
    {
    mailSenderServiceImpl.send(recipient = "email@gmail.com", subject = "Exception", content = "We have got a problem here!")
    }
}

代码的这一部分给了我这个堆栈:

Caused by: org.aspectj.lang.NoAspectBoundException: Exception while initializing myproject.mail.aspect.ExceptionAspect: java.lang.NoSuchMethodError: myproject.mail.aspect.ExceptionAspect: method <init>()V not found
at myproject.mail.aspect.ExceptionAspect.aspectOf(ExceptionAspect.kt:1)
at myproject.mail.handler.MessageHandler.handleMessage(MessageHandler.kt:23)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:132)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:438)
... 40 more
Caused by: java.lang.NoSuchMethodError: myproject.mail.aspect.ExceptionAspect: method <init>()V not found
at myproject.mail.aspect.ExceptionAspect.ajc$postClinit(ExceptionAspect.kt:1)
at myproject.mail.aspect.ExceptionAspect.<clinit>(ExceptionAspect.kt:1)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at kotlin.reflect.jvm.internal.FunctionCaller$Constructor.call(FunctionCaller.kt:66)
at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:107)
at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod(KCallableImpl.kt:149)
at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:111)
at org.springframework.beans.BeanUtils$KotlinDelegate.instantiateClass(BeanUtils.java:738)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:118)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:271)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1269)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1126)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:756)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:751)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:387)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at myproject.mail.MailBotKt.main(MailBot.kt:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

我尝试通过使用lateinit var或将其设置为null,但默认情况下尝试将其注入现场,但我没有成功(如果是lateinit,则NPE告诉我该字段尚未初始化..(。该怎么办?

谢谢!

我做了一个最小的示例,可以重现问题:https://github.com/ashofthephoenix/spring-boot-ltw

我必须在我的配置类中声明一个方面的bean,并在该方面的服务上添加@inject(或@autowired(。就是这样。

@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
@Configuration
open class AspectConfiguration : LoadTimeWeavingConfigurer
{
   override fun getLoadTimeWeaver(): LoadTimeWeaver = InstrumentationLoadTimeWeaver()
   @Bean
   open fun aspect(): ExceptionAspect = Aspects.aspectOf(ExceptionAspect::class.java)
}

最新更新