我的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的错误。
感谢任何帮助。感谢
答案 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添加到方面,或者更改字段在方面中的可见性并直接设置它。您还需要从方面中删除参数化构造函数,以便可以使用默认的无参数构造函数。