在post请求中传递可分页(spring数据)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在post请求中传递可分页(spring数据)相关的知识,希望对你有一定的参考价值。

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

我想知道如何将pageable作为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);

答案

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

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

@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]

另一答案

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

POST http://localhost:8080/xyz?page=2&size=50
Content-Type: application/json

  "filterABC": "data"

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

另一答案

创建一个将Pageable和QueryDto对象作为成员的类。然后在这个新对象的post体中传递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.
        

另一答案

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识别为Sorting / Pagination参数,如下所示

number - Page number

size - Page Size

sort - sort by(Order by)

direction - ASC / DESC

以上是关于在post请求中传递可分页(spring数据)的主要内容,如果未能解决你的问题,请参考以下文章

带有可分页的 Spring 自定义查询

使用连接表存储库的@manytomany 中的 Spring 数据 jpa 规范和可分页

如何使用 Datatable 以 POST 类型传递请求正文数据以使用 Javascript 进行服务器端分页

Spring boot - sortBy(可分页)内的减法

在 Spring Data 存储库中包含域对象安全 @PostFilter 可分页端点

Spring Boot中的可分页[重复]