当前位置: 首页 > 知识库问答 >
问题:

Spring-aop:@Independence:java.lang.IllegalArgumentException:引用的错误类型不是注释类型

欧阳勇
2023-03-14
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;

}
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
    }
}
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)

共有1个答案

周宸
2023-03-14

我没有尝试运行您的代码,但当我浏览它时,我立即注意到两件事:

> 内部Spring类型的

  • BeanCreationException经常发生在方面切入点太宽的情况下,即方面也被编织到Spring类中(即使没有在其中执行)。在这种情况下,您希望通过添加类似······&&在(my.package.*)中找到切入点。或者,如果您的方面在一个库中可能针对未知的包名运行,您可以排除由于!在(org.springframework..*)或任何适用于您的情况的包名而导致问题的Spring包或类。请参阅我的答案。

    您的@around建议返回void,即它也只匹配void方法,这可能不是您所希望的。为了匹配非void方法,建议必须返回void以外的内容,如果要匹配任何返回类型,通常只返回object。还要确保返回procede()的结果或任何其他希望返回的结果。

  •  类似资料:
    • 我正在尝试创建一个自定义注释。我有这样的注释: 我有一个方面的切入点: 但我得到了这个错误,我不明白为什么: org.springframework.security.config.annotation.configuration.objectPostProcessorConfiguration':bean初始化失败;嵌套异常为java.lang.IllegalArgumentException:

    • 当使用带有类级注释的Spring AOP时,Spring似乎总是为每个类创建并返回一个代理或拦截器,不管它们是否有注释。 此行为仅用于类级注释。对于方法级注释或执行切入点,如果不需要拦截,返回一个POJO。 这是虫子吗?按设计?还是我做错了什么?

    • 我正在尝试编译我正在编写的Java Web应用程序,并且我遇到了编译错误,我不知道该怎么办。从我完成的谷歌搜索中,我发现了这个SO问题,但是提问者使用的是EJB,而我的错误是在JPA实体类中。 下面是maven构建错误。 这是我的用户类文件。 我查看了javax.persistence.Index JavaDoc,我的声明是正确的,所以我在这里被难住了,有人知道我做错了什么吗?感谢您的时间和考虑。

    • 在编译过程中,我遇到一个错误:“注释类型不适用于这种声明”。和细节: 我使用JDK 1.6.18和@XmlElement在这个版本中不可用。我发现JAXB(它的版本)中的主要问题。它在这里被讨论: XmlElement注释用WebParam脱盐 是否可以替换JAXB实现在JavaJRE 1.6 SE中的版本?。 我使用认可的方法($JAVA_HOME/lib/认可)更新了JDK中的JAXB,但它仍

    • //我正在尝试此代码,但它没有添加到firebase //它给出了这些错误 处理手势时引发了以下_TypeError:类型“List”不是类型“String”的子类型 抛出异常时,这是堆栈:#0个SharedReferences。getString(包:共享首选项/共享首选项。dart:98:35)#1 CheckItemInNot(包:e_shop/Store/storehome.dart:33

    • 我刚刚学会了如何在flutter中使用。在使用这个库之前,我用实现的webservice工作正常。 现在,在更改为使用后,出现了错误,无法解决此问题 错误是: _InternalLinkedHashMap不是“BuiltRegister”类型的子类型 我的服务器只获取移动电话号码,这是json响应结构: 我构建具有结构的寄存器: 终端返回中的命令成功,我没有任何问题,现在这是我的实现: 和拦截器实