返回

使用 Spring HTTP Interface 將 PageRequest 物件映射到查詢參數的最佳實踐

java

使用 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 实现与控制器方法签名的一致性。尽管这不是一个完美的解决方案,但它提供了一种工作的方法。

常见问题解答

  1. 为什么 Spring HTTP Interface 无法自动将 PageRequest 对象映射到查询参数?
    Spring HTTP Interface 是一个较新的框架,可能尚未支持所有可能的用例。

  2. 是否存在其他方法可以将 PageRequest 对象映射到查询参数?
    除了手动映射属性之外,可以使用自定义转换器。

  3. 如何使用自定义转换器?
    可以实现 org.springframework.http.converter.HttpMessageConverter 接口,并将其注册到 Spring 应用程序上下文中。

  4. 为什么不使用 @RequestBody
    @RequestBody 适用于将 JSON 或 XML 等请求正文映射到对象中。查询参数是不同的,使用 @RequestParam 更合适。

  5. 这种方法在性能或可伸缩性方面是否有任何影响?
    手动映射属性比使用自动映射要慢一点,但对于大多数应用程序来说,性能影响可以忽略不计。