Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有依赖项注入的AspectJ类的类构造函数中存在NoAspectBoundException错误_Java_Maven_Dependency Injection_Aspectj - Fatal编程技术网

Java 具有依赖项注入的AspectJ类的类构造函数中存在NoAspectBoundException错误

Java 具有依赖项注入的AspectJ类的类构造函数中存在NoAspectBoundException错误,java,maven,dependency-injection,aspectj,Java,Maven,Dependency Injection,Aspectj,我的Java程序中有一个使用注释@Aspect的AspectJ类,我想使用@Inject对接口类进行注入来创建一个类构造函数,但它给了我一个异常错误,如下所示: de.hpi.cloudraid.exception.InternalClientError: org.aspectj.lang.NoAspectBoundException: Exception while initializing de.hpi.cloudraid.service.MeasurementAspect: java.la

我的Java程序中有一个使用注释@Aspect的AspectJ类,我想使用@Inject对接口类进行注入来创建一个类构造函数,但它给了我一个异常错误,如下所示:

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
我试着使用普通的注入,比如private@Inject RemoteStatisticService RemoteStatisticService;但它给了我NullPointerException的错误


感谢您的帮助。谢谢,

方面不是依赖注入的候选对象,因此您必须克服这个限制。它们也由aspectj运行时实例化,而不是CDI,您无法控制它们的实例化

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

您可以使用类似于以下内容的启动单例助手bean:

@Singleton
@Startup
public class MeasurementAspectSetup {

    @Inject
    private RemoteStatisticService remoteStatisticService;

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

}

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

方面需要无参数构造函数。依赖注入对方面不起作用,您需要在应用程序启动时手动注入。请看我对类似问题的回答。这不是公认的答案,但我认为它比使用类型间声明的接受的答案更简单,并且也需要管理建议的bean,这不是我的回答中的要求。@ N.A.NDO胡EL DFKEKE感谢您的建议,但是在这种情况下,GreeterAspect。在我的例子中要实现,我想不出类似的解决方案,因为我正在注入一个接口类,我相信不可能实现接口类的getter和setter。另外,我的包中不存在aspectOf()方法,可能是因为我使用的是注释,而不是aspect类的纯AspectJ实现?CMIIW@N实际上,我想使用一个“第三方”类,而不是将接口注入方面,而是将接口注入这个类,但仍然存在NullPointerException错误。也许你可以帮助研究一下,谢谢你可以为接口制作setter和getter,这没关系,它只是一种类型。我错过了你说的AspectJ注释风格的部分,因此,我将在这里提供一个快速答案。在这种情况下,我应该将接口RemoteStatisticService注入或启动到MeasurementAspect类中吗?我已经尝试了将接口RemoteStatisticService注入到MeasurementAspect中的代码,但仍然存在NullPointerException错误。MeasurementAspect类的代码(由于太长而仅摘录)创建了一个与我的答案类似的单例启动bean。在
setupAspect()
方法中放置调试断点,并检查应用程序启动时发生的情况。它应该在该方法中停止,并且您应该使用该方法来设置方面依赖项。方法完成后,您的方面应该可以运行了。您可以在aspect中使用布尔标志来指示安装已完成,并在运行时检查其值,以便aspect在安装完成之前不会尝试运行。@NándorElődFeketeI实际上已经尝试创建一个单独的类,我可以用它来注入接口,aspect类只需要实例化这个类,你可以看到我的另一个问题,但问题仍然是依赖注入的NullPointerException。这个答案并不试图解决你的简单CDI问题。它只是试图解决在CDI环境中设置方面依赖关系的问题。为了让它工作,它需要一个工作的CDI设置。如果
remoteStatisticService
字段没有被注入到
measurementspectsetup
helper类中,则表示您需要首先解决该问题。您可能缺少
RemoteStatisticService
接口的实现。
@Singleton
@Startup
public class MeasurementAspectSetup {

    @Inject
    private RemoteStatisticService remoteStatisticService;

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

}