Pagination Micronaut控制器,使用分页功能分页

Pagination Micronaut控制器,使用分页功能分页,pagination,controller,micronaut,Pagination,Controller,Micronaut,我正在尝试使用带有分页的Micronaut控制器。Micronaut数据必须使用类访问存储库并返回 如果要显示此分页数据,则会出现问题。我无法通过分页创建对控制器的调用。这里我有一个简单的控制器: @控制器 公共类分页控制器{ 私有静态最终记录器Logger=LoggerFactory.getLogger(PageableController.class); @Get(products=APPLICATION_JSON,value=“/test{?pageable}”) 公共页getNames(

我正在尝试使用带有分页的Micronaut控制器。Micronaut数据必须使用类访问存储库并返回

如果要显示此分页数据,则会出现问题。我无法通过分页创建对控制器的调用。这里我有一个简单的控制器:

@控制器
公共类分页控制器{
私有静态最终记录器Logger=LoggerFactory.getLogger(PageableController.class);
@Get(products=APPLICATION_JSON,value=“/test{?pageable}”)
公共页getNames(@Nullable Pageable Pageable){
info(“pageable{}”,pageable);
如果(可分页==null){
返回页,共页(Arrays.asList(“foo”,“bar”),可分页。未分页,2);
}否则{
返回第页,共页(Arrays.asList(“foo”,“bar”),可分页,2);
}
}
}
我希望能用这样的东西来称呼它。但当前记录器显示pageable始终为空:

@MicronautTest
类PageableControllerTest{
@注入
@客户(“/”)
私人RxHttpClient客户端;
@试验
void callsWithPageable(){
字符串uri=“/test?size=20,number=2”;
String orders=client.toBlocking().retrieve(HttpRequest.GET(uri));
//TODO、断言顺序和分页
}
如果我们能用以下方法测试它,那就更好了:

@测试
void callsWithPageableParsingJson(){
字符串uri=“/test?size=20,number=2”;
//这无法解析,因为它无法生成页面。
Page pages=client.toBlocking().retrieve(HttpRequest.GET(uri),pageOf(String.class));
断言(pages.getSize(),为(2));
资产(pages.getContent(),包含(“foo”、“bar”);
}
//受论点的启发
私有静态参数pageOf(类类型){
返回参数.of((Class)((Class)Page.Class),类型);
}
这表明分页的正确方法是使用Micronaut数据

“/test{?pageable}”
意味着绑定到一个称为pageable的查询值

“/test{?pageable*}”
意味着将所有查询值绑定到一个名为pageable的参数


在我的申请中,你想要后者,我也接受可分页的,我没有任何问题。我和你的区别是:

  • 我的路径只是
    @Get(“/test”)
    即没有
    {pageable}
    部分
  • 我不会将我的
    可分页
    设置为
    @Nullable
    。从micronaut代码中可以跟踪到,它不会像对待任何其他对象一样对待
    可分页
    。它对它有特殊的处理(比如测试参数类型是否为
    可分页
    ,如果是,则执行某些操作)

  • 你能试试这两件事吗?

    通过添加以下依赖项解决了问题:

    
    io.micronaut.data
    .只需将i作为类路径,它将自动作为绑定器注入,无需额外配置

    是的,Free See是正确的,现在我可以从路径中删除pageable参数,并且方法中的参数不需要是@Nullable:

    @控制器
    公共类分页控制器{
    私有静态最终记录器Logger=LoggerFactory.getLogger(PageableController.class);
    @Get(products=APPLICATION_JSON,value=“/test”)
    公共页getNames(可分页){
    info(“pageable{}”,pageable);
    返回页,共页(Arrays.asList(“foo”、“bar”、“baz”),可分页,3);
    }
    
    我们称之为新的,使用中定义的

    • 默认页面参数“页面”
    • 默认大小参数“大小”
    • 默认排序参数“排序”
    如果要使用不同的参数,可以使用以下属性对其进行更改:

    micronaut:
      data:
        pageable:
         max-page-size: 500
    
    你可以用

    @测试
    void callsWithPageable(){
    字符串uri=“/test?page=1&size=2”;
    Page pages=client.toBlocking().retrieve(HttpRequest.GET(uri),pageOf(String.class));
    断言(pages.getPageNumber(),为(1));
    断言(pages.getTotalPages(),为(2));
    断言(pages.getSize(),为(2));
    资产(pages.getContent(),包含(“foo”、“bar”、“baz”);
    }
    

    而且,为了让事情变得更好,客户端可以使用返回参数的pageOf方法将结果转换为一个页面>

    嗨,James,我刚刚测试了它,似乎不起作用。它可以编译,但收到的可分页参数为空。这肯定是正确的方法。你的应用程序肯定有其他问题,我可能需要更改e更多,因为我得到:io.micronaut.http.client.exceptions.HttpClientResponseException:未指定必需参数[Pageable Pageable]