使用方面时,Spring Boot RestController的构造函数未调用



我是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无法建议,因为它们不能被覆盖。

希望这对您有帮助!

最新更新