使用 Spring HTTP Interface 將 PageRequest 物件映射到查詢參數的最佳實踐
2024-03-03 13:33:15
使用 Spring HTTP Interface 将对象映射到查询参数
简介
在开发 RESTful API 时,将请求参数映射到控制器中的对象是一个常见场景。使用 Spring HTTP Interface 时,这可以通过将参数对象添加到方法签名中来实现。
但是,当涉及到复杂的请求对象时,问题就出现了。在本文中,我们将探索如何将 PageRequest 对象映射到查询字符串,以实现与控制器方法签名的无缝对接。
问题
以下 @GetExchange 方法不起作用:
@GetExchange("/articles/{type}")
List<Article> listArticles(@PathVariable String type, PageRequest req);
原因是 Spring HTTP Interface 无法自动将 PageRequest 对象映射到查询参数。
以下方法也不起作用:
@GetExchange("/articles/{type}")
List<Article> listArticles(@PathVariable String type, @RequestParam PageRequest req);
原因是 Spring HTTP Interface 仍然无法将 PageRequest 对象映射到查询参数,因为 @RequestParam 仅适用于基本类型和字符串。
解决方案
唯一能正常工作的方法是将 PageRequest 对象的属性手动映射到查询参数:
@GetExchange("/articles/{type}")
List<Article> listArticles(@PathVariable String type, @RequestParam Integer pageSize, @RequestParam Integer page);
这样,GET 请求 GET /articles/red/?pageSize=10&page=4
将成功映射到 PageRequest 对象中。
理想情况
理想情况下,希望控制器和客户端的方法签名保持一致。这可以提高代码的可读性和可维护性。
结论
通过将 PageRequest 对象的属性手动映射到查询参数,我们可以使用 Spring HTTP Interface 实现与控制器方法签名的一致性。尽管这不是一个完美的解决方案,但它提供了一种工作的方法。
常见问题解答
-
为什么 Spring HTTP Interface 无法自动将 PageRequest 对象映射到查询参数?
Spring HTTP Interface 是一个较新的框架,可能尚未支持所有可能的用例。 -
是否存在其他方法可以将 PageRequest 对象映射到查询参数?
除了手动映射属性之外,可以使用自定义转换器。 -
如何使用自定义转换器?
可以实现 org.springframework.http.converter.HttpMessageConverter 接口,并将其注册到 Spring 应用程序上下文中。 -
为什么不使用
@RequestBody
?
@RequestBody
适用于将 JSON 或 XML 等请求正文映射到对象中。查询参数是不同的,使用@RequestParam
更合适。 -
这种方法在性能或可伸缩性方面是否有任何影响?
手动映射属性比使用自动映射要慢一点,但对于大多数应用程序来说,性能影响可以忽略不计。