Java 使用aspect时未调用Spring Boot RestController的构造函数
我是AOP新手,目前正在尝试为带有自定义注释的控制器方法实现一个方面。 当调用myFunction时,我总是在存储库上得到一个NullPointerException。似乎我有两个控制器的实例。其中一个实例没有自动连接存储库。当我删除@MyAnnotation时,一切正常 你能给我一些关于如何强制Spring/AspectJ使用我的构造函数的提示吗 我的控制器看起来像:Java 使用aspect时未调用Spring Boot RestController的构造函数,java,spring,aspectj,aspect,Java,Spring,Aspectj,Aspect,我是AOP新手,目前正在尝试为带有自定义注释的控制器方法实现一个方面。 当调用myFunction时,我总是在存储库上得到一个NullPointerException。似乎我有两个控制器的实例。其中一个实例没有自动连接存储库。当我删除@MyAnnotation时,一切正常 你能给我一些关于如何强制Spring/AspectJ使用我的构造函数的提示吗 我的控制器看起来像: @RestController @RequestMapping(value = "/api") public class My
@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;
}
尝试用@Autowired注释构造函数
@Autowired
public MyController(Repository repository) {
this.repository = repository;
}
它来自这样一个事实,即带注释的方法是
final
如果您可以删除final
关键字,它就会起作用
如果你在谷歌上搜索“SpringAOP最终方法”,你会发现更多的信息,但基本上,当spring创建代理时,它会从原始类生成一个子类,用你的方面包装对super的调用。问题是子类无法继承最终的方法,因此代理很难工作。因此,很多限制都来自于此,而AOP对final
的东西不起多大作用
文档中提到了这一限制,我认为您不会找到解决方法:
11.6代理机制
final
方法不能被建议,因为它们不能被覆盖
希望这对你有帮助 这是因为带注释的方法是
final
如果您可以删除final
关键字,它就会起作用
如果你在谷歌上搜索“SpringAOP最终方法”,你会发现更多的信息,但基本上,当spring创建代理时,它会从原始类生成一个子类,用你的方面包装对super的调用。问题是子类无法继承最终的方法,因此代理很难工作。因此,很多限制都来自于此,而AOP对final
的东西不起多大作用
文档中提到了这一限制,我认为您不会找到解决方法:
11.6代理机制
final
方法不能被建议,因为它们不能被覆盖
希望这对你有帮助 我想在构造函数参数之前也需要@Qualifier注释。我已经尝试用@Autowired注释构造函数了。但我仍然得到了NPE。我认为在构造函数参数之前还需要@Qualifier注释。我已经尝试用@Autowired注释构造函数。但是我仍然得到了NPE。你的Spring版本是什么?Spring Boot Starter的父版本是1.5.6.RELEASEOk,因此绝对不需要
@Autowired
,答案中提到了这一点。我会亲自测试,我很确定这是由于控制器的代理方式。我正在尝试复制,我会回来找你。你的Spring版本是什么?Spring Boot Starter的父版本是1.5.6.RELEASEOk,因此绝对不需要@Autowired
,答案中提到了这一点。我会亲自测试,我很确定这是由于控制器的代理方式。我正在努力繁殖,我会回来找你的。非常感谢你!我花了几个小时才发现我的错误。非常感谢!我花了几个小时来找出我的错误。