![](/img/trans.png)
[英]java.lang.IllegalArgumentException: error Type referred to is not an annotation type
[英]Spring - AOP: @within Exception: java.lang.IllegalArgumentException: error Type referred to is not an annotation type
我是 AOP 和 AspectJ 的新手。 我正在嘗試圍繞元素類型TYPE
的自定義注釋編寫自定義邏輯。 我還想使用注解下的參數在 around 方法中編寫自定義邏輯。 我收到下面提到的錯誤。 我嘗試閱讀多個來源,大多數來源都與使用@annotation
相關。 我發現很難理解。 有人可以解釋一下,為什么@within
的以下方式不適用於一些明確的例子?
注釋( Slf4jTrace.java ):
package io.ud.project.falcon.logging;
import io.ud.project.falcon.logging.generator.AbstractLogTraceIdGenerator;
import io.ud.project.falcon.logging.generator.DefaultLogTraceIdGenerator;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Slf4jTrace {
String traceKey() default "traceId";
Class<? extends AbstractLogTraceIdGenerator> traceValueGenerator() default DefaultLogTraceIdGenerator.class;
}
方面組件( Slf4jTraceAspect.java ):
package io.ud.project.falcon.logging;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
@SuppressWarnings("unused")
@Slf4j
public class Slf4jTraceAspect {
@Pointcut("execution(public * *(..))")
public void publicOperation() {
//Using this pointcut annotation for Around method.
}
@Around(value = "@within(slf4jTrace) && publicOperation()")
public void logTrace(ProceedingJoinPoint joinPoint, Slf4jTrace slf4jTrace) throws Throwable {
//Custom logic that uses slf4jTrace's parameters
joinPoint.proceed();
//Custom logic that uses slf4jTrace's parameters
}
}
注釋類( Foo.java ):
package io.ud.project.falcon.logging;
import io.ud.project.falcon.logging.Slf4jTrace;
@Slf4jTrace(traceKey = "auditID")
public class Foo {
public void doSomething() {
//Something happens here.
}
}
應用程序啟動錯誤:
, 2021-01-02 22:16:41,340, ERROR [main] o.s.b.SpringApplication.reportFailure(833) | Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectMapperConfigurer' defined in springfox.documentation.spring.web.SpringfoxWebMvcConfiguration
: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error Type referred to is not an annotation type: slf4jTrace
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:497)
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:205)
at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:238)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:709)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:534)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
at io.ud.project.falcon.FalconApplication.main(FalconServiceApplication.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
我沒有嘗試運行你的代碼,但是當我看到它時,我立即注意到了兩件事:
如果方面切入點太寬,則內部BeanCreationException
類型的 BeanCreationException 經常發生,即方面也被編織到(即使未在其中執行)Spring 類。 在這種情況下,您希望通過添加類似... && within(my.package..*)
類的內容來限制方面 scope 到您的切入點。 或者,如果您的方面在可能針對未知 package 名稱運行的庫中,您可以排除 Spring 包或類導致問題的.within(org.springframework..*)
或任何 ZEFE90A8E604A7C8C88D03 名稱適用於您的案例7 另請參閱我的答案。
您的@Around
建議返回void
,即它也只會匹配void
方法,這可能不是您想要的。 為了匹配非 void 方法,通知必須返回void
以外的內容,如果您想匹配任何返回類型,通常只Object
。 還要確保返回proceed()
的結果或您想要返回的任何其他結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.