Spring - AOP: @within Exception: java.lang.IllegalArgumentException: error Type referred to is not an annotation type(Spring-AOP:@在异常:java.lang.IlLegalArgumentException:引用的错误类型不是批注类型)
问题描述
我是AOP和AspectJ的新手。我正尝试围绕元素类型为TYPE
的自定义注释编写一个自定义逻辑。我还想在我的注释下使用这些参数来在环绕方法中编写一个定制逻辑。我收到了下面提到的错误。我试着阅读了多个来源,大多数来源都与使用@annotation
有关。我发现很难理解这一点。谁能解释一下,为什么以下@within
的方法不适用于一些明显的例子?
Annotation(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;
}
方面Component(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
如果方面切入点太过宽泛,就经常会出现内部Spring类型的问题,也就是说,方面也被编织到了Spring类中(即使没有在其中执行)。在这种情况下,您希望通过向切入点添加类似... && within(my.package..*)
的内容来限制方面范围。或者,如果您的方面位于可能针对未知包名运行的库中,您可以通过!within(org.springframework..*)
或任何适用于您的包名来排除引起问题的Spring包或类。另请参阅my answer here。您的
@Around
建议返回void
,即它还将只匹配void
方法,这可能不是您想要的。为了匹配非空方法,建议必须返回void
以外的内容,如果要匹配任何返回类型,通常只返回Object
。还要确保返回proceed()
的结果或您希望返回的任何其他结果。
这篇关于Spring-AOP:@在异常:java.lang.IlLegalArgumentException:引用的错误类型不是批注类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Spring-AOP:@在异常:java.lang.IlLegalArgumentException:引用的错误类型不是批注类型
基础教程推荐
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01