不推荐分页参数

qacovj5a  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(278)

我最近收到一个请求,要求将spring rest分页参数“page”和“size”重命名为“pageindex”和“pagesize”。我的控制器将可分页对象作为参数。也就是说,我知道我可以通过如下设置属性来重命名这些参数:

spring.data.rest.page-param-name=pageIndex
spring.data.rest.limit-param-name=pageSize

但是,因为我正在开发的api正在被其他开发人员使用,所以我需要反对而不是删除“page”和“size”参数(同时继续让api尊重它们的值),同时支持新的可分页参数名称。我查阅了各种文件和文章,经过一天的搜索,我仍然不清楚如何完成这项任务。
我的控制器方法如下所示:

@ApiPageable
@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.GET)
public Page<MyBean> getBeans(@RequestParam(required = false) final String blah,
                               final Pageable pageable) {

    return someService.doSomething(blahStr, pageable); 
}

提前感谢,如果在我的搜索日,我可能错过了关键的一块文件,我正在寻找,请指点我的方向,并接受我的道歉。
编辑:澄清一下这个问题。。。重命名不涉及更改url。实际上,url必须保持相同。相反,要重命名的是一组url分页参数。要清楚的是,如果这个问题所涉及的端点看起来像这样,并且是一组公共分页参数的例外,这些参数通常用于(但不限于)以下的排列或组合:

/beans
/beans?page=2
/beans?size=5
/beans?page=2&size=5
/beans?sort=created,ASC&page=4&size=6

…然后使用相同的url创建第二个端点(但所有参数都将required标记为false),在我尝试运行api时会出现不明确的Map。因此,除非有巧妙的方法来区分这些端点(使用不推荐的参数的端点和使用新参数的新端点),否则这个解决方案似乎需要两个以上的端点……或者最好有一个巧妙的“银弹”方法来处理这个问题。

vi4fp9gy

vi4fp9gy1#

使用两个端点:一个用于已弃用的api,另一个用于新的api。在不推荐的api中,将不推荐的参数转换为新参数,调用内部服务,将响应转换为不推荐的响应。
稍后,在所有客户机迁移到新api之后,或者在预定义的迁移周期之后,您可以决定删除不推荐使用的端点。
更新
对于不能(或还不想)使用更改的api的客户机,提供一个实现旧api的端点。此方法可以如下所示:

@GetMapping(path = "/oldapi/...")
public Page<MyBean> getBeans(
    @RequestParam(required = false) final String blah,
    @RequestParam(value = "pageSize", required = false) Integer pageSize,
    @RequestParam(value = "pageNum", required = false) Integer pageNum,
    @RequestParam(value = "sort", required = false)
) {
    // Create Pageable object from request parameters
    ...
    // Call service or repository with this pageable
    ...
}

在此方法中,可以使用任何参数名称。对于那些需要旧名字的人,你可以保留旧名字。
关于终结点的数量:我指的是两个终结点:一个是api名称保持不变的终结点,另一个是更改的终结点(你写的,我最近有一个重命名的请求…)
更新2
支持2版本api的好方法是使用2个端点。如果您想通过一个端点提供2个api,那么这很容易出错。在简单的情况下,这是可能的。例如,您将方法定义为:

@GetMapping(path = "/oldapi/...")
public Page<MyBean> getBeans(
    @RequestParam(value = "size", required = false) Integer size,
    @RequestParam(value = "pageSize", required = false) Integer pageSize,
    @RequestParam(value = "page", required = false) Integer page,
    @RequestParam(value = "pageIndex", required = false) Integer pageIndex,
    ...
) {
    Integer pSize = pageSize != null ? pageSize : size;
    Integer pIndex = pageIndex != null ? pageIndex : page;
    ...
}

保存这样的代码可能相当复杂。例如,如果某些参数是必需的,那么在一个端点中实现它会很复杂并且容易出错,但是如果您有两个不同的端点,则实现起来非常简单。我劝你不要用这种方法。
我的建议是:为那些想使用不推荐的api的人提供一个单独的端点。他们不必更改代码,只需更改配置参数以指向一个已弃用api的端点。如果他们想继续使用不推荐的api,这是一个正常的价格。

相关问题