我是AOP的新手,目前试图实现使用自定义注释注释的控制器方法的方面。当调用 myFunction 时,我一直在 repository 上获得 nullpoInterException 。看来我有两个控制器的实例。其中之一是实例化的,而无需自动启动存储库。当我删除@MyAnnotation时,一切都按预期工作。
您能给我任何暗示如何强制Spring/fackj使用我的构造函数吗?
我的控制器看起来像:
@RestController
@RequestMapping(value = "/api")
public class MyController {
private Repository repository;
public MyController(Repository repository) {
this.repository = repository;
}
@RequestMapping(value = "/{variable1}", method = GET)
@MyAnnotation
public final FeatureCollection myFunction(
final @PathVariable(required = true) long variable1
) {
repository.findById(variable1);
(...)
}
}
方面:
@Aspect
public class MyAspect {
@Around("@annotation(MyAnnotation)")
public Object any(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed();
}
}
配置:
@Configuration
@EnableAspectJAutoProxy
public class WebConfig {
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}
尝试用@Autowired
注释构造函数@Autowired
public MyController(Repository repository) {
this.repository = repository;
}
它来自注释方法是 final
。
如果您可以删除final
关键字,则可以使用。
如果您搜索了类似"春季aop aop final方法"的内容。。问题在于,最终方法不能由子类继承,因此这使得代理很难工作。因此,从中有很多局限性,而AOP与final
的东西无效。
文档中提到了此限制,我认为您不会为此找到解决方法:
11.6代理机制
...
final
无法建议,因为它们不能被覆盖。
希望这对您有帮助!