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

时间:2016-05-18 08:13:01

标签: java maven dependency-injection aspectj

我的Java程序中有一个使用注释@Aspect的AspectJ类,我想创建一个使用@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

以下是我班级的片段:

@Aspect
public class MeasurementAspect {

    private final RemoteStatisticService remoteStatisticService;

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

我尝试使用普通注入,如私有@Inject RemoteStatisticService remoteStatisticService;但它给了我NullPointerException的错误。

感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

方面不适合依赖注入,因此您必须解决此限制。它们也是由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添加到方面,或者更改字段在方面中的可见性并直接设置它。您还需要从方面中删除参数化构造函数,以便可以使用默认的无参数构造函数。