如何在Spring HTTP Interface的@GetExchange中用对象处理请求参数?
Spring HTTP Interface 中对象映射为查询参数的正确方式
在Spring MVC控制器中,我们可以直接将对象作为方法参数,框架会自动把请求的查询参数映射到对象的对应属性,示例如下:
public record PageRequest(Integer pageSize, Integer page) {} @GetMapping("/articles/{type}") List<Article> listArticles(@PathVariable String type, PageRequest req) { // 业务逻辑实现 }
但在Spring HTTP Interface的@GetExchange注解场景下,直接传入对象或用@RequestParam标记对象的写法都无法生效:
无效写法1:
@GetExchange("/articles/{type}") List<Article> listArticles(@PathVariable String type, PageRequest req);
无效写法2:
@GetExchange("/articles/{type}") List<Article> listArticles(@PathVariable String type, @RequestParam PageRequest req);
此前只能将对象拆解为单个参数实现需求:
@GetExchange("/articles/{type}") List<Article> listArticles(@PathVariable String type, @RequestParam Integer pageSize, @RequestParam Integer page);
这种写法虽然能生成类似GET /articles/red/?pageSize=10&page=4的请求,但无法和控制器端的方法签名保持一致。
正确解决方案:使用@ParameterObject注解
在Spring HTTP Interface中,只需给对象参数添加org.springframework.web.service.annotation.ParameterObject注解,就能让框架自动将对象的每个属性映射为对应的查询参数,同时保持和控制器端完全一致的方法签名:
@GetExchange("/articles/{type}") List<Article> listArticles(@PathVariable String type, @ParameterObject PageRequest req);
调用该方法时,框架会自动把PageRequest的pageSize和page属性拼接为查询参数,生成符合预期的请求URL,完美匹配控制器端的参数接收逻辑。
内容的提问来源于stack exchange,提问作者Fredrik Rambris
相关产品推荐
相关产品推荐

