Java 使用aspect时未调用Spring Boot RestController的构造函数

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

我是AOP新手,目前正在尝试为带有自定义注释的控制器方法实现一个方面。 当调用myFunction时,我总是在存储库上得到一个NullPointerException。似乎我有两个控制器的实例。其中一个实例没有自动连接存储库。当我删除@MyAnnotation时,一切正常

你能给我一些关于如何强制Spring/AspectJ使用我的构造函数的提示吗

我的控制器看起来像:

@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
,答案中提到了这一点。我会亲自测试,我很确定这是由于控制器的代理方式。我正在努力繁殖,我会回来找你的。非常感谢你!我花了几个小时才发现我的错误。非常感谢!我花了几个小时来找出我的错误。