如何在 REST 调用开始时访问 @PathVariable?

我正在尝试从在控制器类级别定义的请求 URL,从使用 @PostConstruct 注释的方法访问路径变量。想法是在执行相关控制器方法之前,在 API 调用开始时使用此路径变量来初始化局部变量。这是为了避免在每个方法中都有那段代码,而只是让控制器在调用开始时设置变量。


该代码可能会更好地解释这一点:


@RestController

@RequestMapping("/path/{variable}")

public class BaseController {


    protected Object object;


    @PostConstruct

    protected void setObject(@PathVariable("variable") Long variable){

        this.object= objectRepository.findById(variable).get();

    }

}

显然,此时我遇到了“生命周期方法注释需要无参数方法”错误 - 所以我知道 @PostConstruct 不是要走的路,但我想知道是否有另一种方法可以实现这一点,也许是什么像 @Before 进行单元测试?


提前致谢!


互换的青春
浏览 251回答 3
3回答

小怪兽爱吃肉

我不确定你为什么真的需要这个。Pathvariable 在 REST 调用期间在外部设置。在启动阶段,您没有此路径变量,这意味着您无法从中解决任何问题。为了更好地了解您要实现的目标以及它为什么不起作用,我建议您阅读这篇简短的 stackoverflow 文章:Spring BeanPostProcessor 究竟是如何工作的?如果您有静态标识符,我宁愿使用 ConfigurationProperties。您能否提供更多有关您要通过此实现的目标的信息?我个人会尽量避免使用全局变量。

侃侃尔雅

在从 BaseController 执行任何方法之前,您可以使用 AOP 和 @Aspect 来运行一段代码。请查看以了解如何实现它。 https://dzone.com/articles/aspect-orienting-programming-with-springboot

梦里花落0921

我不会使用@Value Annotation,因为您将整个配置逻辑分布在整个系统中。@ConfigurationProperties(请参阅此处:https ://www.baeldung.com/configuration-properties-in-spring-boot )将成为您的朋友。您也可以使用其他对象类型以及顶部的验证。关于单元测试中的@Before:@PostConstruct 在构造 bean 本身之后调用,而不是在方法调用之前。如果您想在方法调用之前做一些事情,ArgumentResolver 或使用 Spring AOP 的 Aspect 将是您的朋友,我宁愿使用 ArgumentResolver 并在后台管理所有内容。再一次,我怀疑您是否真的做了正确的设计,因为 @Pathvariable 应该由 API 用户提供,而不是来自配置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java