我在 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/