繁体   English   中英

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

[英]How to access @PathVariable at the start of the REST call?

我正在尝试使用@PostConstruct注释的方法,从在控制器类级别定义的请求URL访问路径变量。 这个想法是在执行相关的控制器方法之前,在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一样进行单元测试?

提前致谢!

我不确定为什么您实际上会需要这个。 REST调用期间在外部设置Pathvariable。 在启动阶段,您没有此pathvariable,这意味着您无法从中解析任何内容。

为了更好地理解您要实现的目标以及为什么它不起作用,我建议阅读这篇简短的stackoverflow文章: Spring BeanPostProcessor的工作原理是什么?

如果您有静态标识符,我宁愿使用ConfigurationProperties。

您能否提供更多有关您要实现的目标的更多信息? 我个人将尝试避免全局变量。

我不会使用@Value注释,因为您正在整个系统中散布整个配置逻辑。 @ConfigurationProperties(请参阅此处: https : //www.baeldung.com/configuration-properties-in-spring-boot )将是您的朋友。 您还可以在顶部使用其他对象类型和验证。

关于单元测试中的@Before:@PostConstruct是在构造bean本身之后而不是在方法调用之前调用的。 如果您想在方法调用之前做某事,使用Spring AOP的ArgumentResolver或Aspect是您的朋友,我宁愿使用ArgumentResolver并在后台进行所有管理。 再一次,我怀疑您实际上是否进行了适当的设计,因为@Pathvariable应该由API用户而不是配置提供。

在从BaseController执行任何方法之前,可以将AOP与@Aspect一起使用来运行一段代码。

请看一下如何实现它。 https://dzone.com/articles/aspect-oriented-programming-with-springboot

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM