【问题标题】:Passing pageable (spring data) in post request在发布请求中传递可分页(弹簧数据)
【发布时间】:2016-01-20 00:47:28
【问题描述】:

我有一个具有以下 API 的 REST API 服务器。 我还有其他一些 API,可以从 GET 请求中获取分页。在这里,我需要发出一个 post 请求来传递 queryDto。所以,我不能将 page=0?size=20 等作为 url 参数传递。

我想知道如何将可分页作为 JSON 对象传递给 POST 请求

@RequestMapping(value = "/internal/search", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public ResponseList<Object> findObjects(@RequestBody QueryDto queryDto, Pageable pageable) {
    if (queryDto.isEmpty()) {
        throw new BadRequestException();
    }

    return someService.findObjectsByQuery(queryDto, pageable);
}

【问题讨论】:

    标签: java spring rest


    【解决方案1】:

    我认为这是不可能的,至少框架尚未提供。

    Spring 有一个 HandlerMethodArgumentResolver 接口和一个名为 PageableHandlerMethodArgumentResolver 的实现,它检索请求参数值,调用类似 HttpServletRequest.getParameter 的东西。因此,您可以绑定 Pageable 实例,并为 GET 和 POST 传递参数“page”和“size”。因此,以下代码有效:

    @RequestMapping(value="/test",method = RequestMethod.POST)
    @ResponseBody
    public String bindPage(Pageable page){
        return page.toString();
    }
    

    $ curl -X POST --data "page=10&size=50" http://localhost:8080/test

    返回: 页面请求[数量:10,大小 50,排序:null]

    但是,如果你传递一个 json,什么都不会发生:

    $ curl -X POST --data "{page:10&size:50}" http://localhost:8080/test

    返回: 页面请求[数量:0,大小20,排序:null]

    【讨论】:

    • 如果您将页面和大小作为查询参数,它对我来说很好。看我的回答。
    【解决方案2】:

    Spring Post 方法

    @RequestMapping(value = "/quickSearchAction", method = RequestMethod.POST)
    public @ResponseBody SearchList quickSearchAction(@RequestParam(value="userId") Long userId, 
                                              Pageable pageable) throws Exception {
        return searchService.quickSearchAction(userId, pageable);
    }
    

    邮递员示例:

    http://localhost:8080/api/actionSearch/quickSearchAction?
    userId=4451&number=0&size=20&sort=titleListId,DESC
    

    上面的 POST Pageable 用于 Spring RESTful 服务中的排序和分页。在 URL 处使用以下语法。

    编号0,大小20,按字段排序titleListId和方向DESC

    Pageable 内部将所有传递参数识别为排序/分页参数,如下所示

    number - Page number
    
    size - Page Size
    
    sort - sort by(Order by)
    
    direction - ASC / DESC
    

    更新: 角度示例: CustomerComponent.ts 文件

    let resultDesignations = null; let fieldName = "designationId"; this.customerService.getDesignations(fieldName, "DESC").subscribe( (data) =&gt; { resultDesignations = data; }, (err) =&gt; { this.error(err.error); }, () =&gt; { this.designations = resultDesignations; } );//END getDesignations

    客户服务.ts

    getDesignations(fieldName: string, sortOrder: string): Observable { 返回 this.httpClient.get("http://localhost:9876/api/getDesignations", { 参数:{ 排序:字段名,排序顺序 } }); }

    【讨论】:

    • 我们如何从 ajax javascript 代码中发送这些参数。
    【解决方案3】:

    如果您继续在 URL 上将它们作为查询参数提供,并且仍然在其中发布数据,这对我来说似乎工作得很好。

    POST http://localhost:8080/xyz?page=2&size=50
    Content-Type: application/json
    {
      "filterABC": "data"
    }
    

    Spring 似乎将页面、大小、排序等转换为提供给方法的 Pageable。

    【讨论】:

    • 这个答案很完美。就我而言,我正在使用 RequestBody 和可分页进行 GET 请求。提供页面和大小作为查询参数允许请求成功通过。
    【解决方案4】:

    创建一个以 Pageable 和 QueryDto 对象为成员的类。然后在这个新对象的 post body 中传递 JSON。

    例如,

    public class PageableQueryDto
    {
        private Pageable pageable;
        private QueryDto queryDto;
    
        ... getters and setters.
    }
    

    编辑 如下面评论中所述,您可能需要实现 Pageable 接口。 结果可能是这样的:

    public class PageableQueryDto implements Pageable
    {
        private Pageable pageable;
        private QueryDto queryDto;
    
        ... getters and setters.
    
        ... Implement the Pageable interface.  proxy all calls to the
        ... contained Pageable object.
    
        ... for example
        public void blam()
        {
            pageable.blam();
        }
    
        ... or maybe
        public void blam()
        {
            if (pageable != null)
            {
                pageable.blam();
            }
            else
            {
                ... do something.
            }
    }
    

    【讨论】:

    • 似乎是一个很好的解决方案。但是,有一个疑问:可能他需要为“Pageable”对象公开一些其他接口,因为 Pageable 是一个接口,并且框架实现没有默认的构造函数或页面和大小的设置器。你不觉得吗?
    【解决方案5】:

    示例示例

    @RequestMapping(path = "/employees",method = RequestMethod.POST,consumes = "application/json",produces = "application/json")
    ResponseEntity<Object> getEmployeesByPage(@RequestBody PageDTO page){
        //creating a pagable object with pagenumber and size of the page
        Pageable pageable= PageRequest.of(page.getPage(),page.getSize());
        return ResponseEntity.status(HttpStatus.ACCEPTED).body(employeeRegistryService.getEmployeesByPage(pageable));
    }
    

    在您的情况下,尝试在 QueryDTO 中添加分页变量 创建一个 Pageable 对象并将其传递给服务

    我认为这会解决 :)

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多