java - 使用依赖注入(inject)的 AspectJ 类的类构造函数中出现 NoAspectBoundException 错误

标签 java maven dependency-injection aspectj

我在 Java 程序中有一个使用注释 @Aspect 的 AspectJ 类,我想创建一个类构造函数,并使用 @Inject 向接口(interface)类进行注入(inject),但它给了我 NoAspectBoundException 错误,如下所示:

de.hpi.cloudraid.exception.InternalClientError: org.aspectj.lang.NoAspectBoundException: Exception while initializing de.hpi.cloudraid.service.MeasurementAspect: java.lang.NoSuchMethodError: de.hpi.cloudraid.service.MeasurementAspect: method <init>()V not found

这是我的类(class)片段:

@Aspect
public class MeasurementAspect {

    private final RemoteStatisticService remoteStatisticService;

    @Inject
    public MeasurementAspect(RemoteStatisticService remoteStatisticService) {
        this.remoteStatisticService = remoteStatisticService;
    }
....
}

我尝试使用普通注入(inject),例如 private @Inject RemoteStatisticService remoteStatisticService;但它给了我 NullPointerException 错误。

感谢任何帮助。谢谢

最佳答案

方面不是依赖项注入(inject)的候选对象,因此您必须解决此限制。它们也是由aspectj运行时而不是CDI实例化的,并且您无法控制它们的实例化。

您可以做的是,创建一个由 CDI 容器处理的单独的类,并将方面的依赖项注入(inject)到该帮助程序类中。然后手动设置此帮助程序类中方面的依赖关系。您可以将此帮助器类标记为启动单例,以便在满足其依赖项后启动时运行。

您可以使用与此类似的启动单例辅助 bean:

@Singleton
@Startup
public class MeasurementAspectSetup {

    @Inject
    private RemoteStatisticService remoteStatisticService;

    @PostConstruct
    private void setupAspect() {
        Aspects.aspectOf(MeasurementAspect.class)
            .setRemoteStatisticService(this.remoteStatisticService);
    }

}

当然,您必须将 RemoteStatisticService 的 setter 添加到切面,或者更改切面中字段的可见性并直接设置它。您还需要从方面删除参数构造函数,以便使用默认的无参数构造函数。

关于java - 使用依赖注入(inject)的 AspectJ 类的类构造函数中出现 NoAspectBoundException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37293827/

相关文章:

java - Spring 的多重依赖

java - 如何在 StringTemplate 中默认转义 HTML?

maven - 建议的 JSF 与 TomEE1.7.x 的依赖关系是什么?

java - 使用来自 JMS 主题的消息时出现延迟

maven - 从 Maven 原型(prototype)生成模块时访问父属性

java - Jenkins 不会在自由风格项目上使用环境变量过滤 Maven 资源

java - 如何在android中的MVP层之间使用注入(inject)?

c# - 简易喷油器 : How to test registrations?

java - 如何为 sourceforge 的开源项目配置环境

java - 当没有输入任何内容时解析生成我生成的错误消息的字符串