当前位置: 首页 > 知识库问答 >
问题:

Spring靴分页

郗丰
2023-03-14

我面临分页数据的问题。页面数据正在使用外部数组dXP建议响应进行计算,我希望它应该通过嵌套数组建议进行计算。我在结果部分提到了响应数据。

我试图更改页面数据计算,但它是使用我们传入的PageImpl()构造函数中的数据进行计算的。

我使用这种方法来分页我们从第三方应用编程接口获得的数据。

但是它正在使用dxp推荐列表进行计算。

#This is the code through I need to generate the response
List<DXPRecommendationResponse> dxpRecommendationslist = new ArrayList<>();

List<DXPActivity> dxpActivities = getThirdResponse(pageable, correlationId,
dxpRecommendationslist, reservationGuestId, reservationId, nbxRecommendationRequest);

return new PageImpl<>(dxpRecommendationslist, pageable, dxpActivities.size());

#This method is used to get data from third party
public List<DXPActivity> getThirdResponse(final Pageable pageable, final String correlationId,
        List<DXPRecommendationResponse> list, String reservationGuestId, String reservationId,
        NBXRecommendationRequest nbxRecommendationRequest) {

    List<DXPActivity> dxpActivities = new ArrayList<>();

    NBXRecommendationResponse nbxRecommendationResponse = vVNBXRecommendationService
            .getCalendarRecommendation(nbxRecommendationRequest, correlationId);

    if (nbxRecommendationResponse != null) {

        DXPRecommendationResponse dxpRecommendationResponse = new DXPRecommendationResponse();
        dxpRecommendationResponse.setReservationGuestId(reservationGuestId);
        dxpRecommendationResponse.setReservationNumber(reservationId);
        dxpRecommendationResponse.setRecommendationType("CalendarType");
        dxpRecommendationResponse.setDateTime(new Date());

        populateActivities(dxpActivities, nbxRecommendationResponse);
        List<DXPActivity> filteredList;
        if (!CollectionUtils.isEmpty(dxpActivities)
                && dxpActivities.size() >= (pageable.getPageSize() * pageable.getPageNumber())) {

            filteredList = Lists.partition(dxpActivities, pageable.getPageSize()).get(pageable.getPageNumber());
        } else {

            filteredList = new ArrayList<DXPActivity>();
        }
        dxpRecommendationResponse.setRecommendations(filteredList);
        list.add(dxpRecommendationResponse);
    }

    return dxpActivities;
}
#This method is used to populate data
private void populateActivities(List<DXPActivity> dxpActivities,
        NBXRecommendationResponse nbxRecommendationResponse) {

    for (Activity activity :nbxRecommendationResponse.getCalendarRecommendation().getRecommendations().getActivities()) {

        DXPActivity dxpActivity = new DXPActivity();
        orikaMapper.map(activity, dxpActivity);
        dxpActivities.add(dxpActivity);
    }
}

响应数据:

{
    "_embedded": {
        "dXPRecommendationResponses": [
        {
            "recommendationType": "CalendarType",
            "reservationGuestId": "525dab66-1492-4908-a3bf-b5de558368e5",
            "reservationNumber": "3a39f9ad-7e34-4bdb-91eb-b907fd6986c7",
            "dateTime": "2019-08-19T14:38:18.413",
            "recommendations": [
            {
                "productCode": "BIKE2006111000",
                "activityName": "Bimini Bike Tour",
                "recommendationId": "1565948843492_410387839_BIKE2006111000_cal",
                "categoryCode": "DARING",
                "activityStartTime": "2020-06-11T08:30:00.000",
                "activityEndTime": "2020-06-11T11:30:00.000",
                "activityDescription": "Bimini Bike Tour",
                "sequence": 34.0,
                "packageId": 103806,
                "sourceId": "BIMINI BIKE",
                "levelOfActivity": "EASY"
            },
            {
                "productCode": "CUL2006110900",
                "activityName": "Bimini Culinary Tour",
                "recommendationId":"156594884349, 
                "categoryCode": "CULTURED",
                "activityStartTime": "2020-06-11T07:30:00.000",
                "activityEndTime": "2020-06-11T12:30:00.000",
                "activityDescription": "Bimini Culinary Tour",
                "sequence": 29.0,
                "packageId": 103940,
                "sourceId": "BIMINI CUL",
                "levelOfActivity": "MODERATE"
            }
            ]
        }
        ]
    },
    "page": {
        "size": 10,
        "totalElements": 1,
        "totalPages": 1,
        "number": 0
    }
}

共有1个答案

陆栋
2023-03-14

这里的问题是PageImpl构造函数的实现,以及如何计算得到的总数。以下代码取自构造函数:

this.total = pageable.toOptional().filter(it -> !content.isEmpty())//
        .filter(it -> it.getOffset() + it.getPageSize() > total)//
        .map(it -> it.getOffset() + content.size())//
        .orElse(total);

这里最重要的一点是第二点,正如doc comment中所述,这是针对不一致性的保险。它会检查你是否在最后一页,如果在最后一页,它会使用第三行来计算结果总计。因此,完全忽略您给出的total。如果你想重写这个行为,你应该实现你的页面,它只使用给定的总数

但是,我认为它在语义上是不正确的。您正在混合可能不应该混合的东西(一种类型的页面对象,但在另一种类型上完成的实际分页)。作为可分页的列表总是有一个元素,你正在分页子元素,这似乎不正确,甚至需要分页子元素吗?

一种可能的解决方案是通过指定Page来使可分页的子元素成为唯一的子元素

 类似资料:
  • 我正在用Thymeleaf构建一个Spring Boot应用程序。我的模板(视图)和静态文件夹都在src/main/Resources/静态和src/main/Resources/tem板下。当我通过main方法(使用eclipse)运行应用程序时,一切都很好。但是,我已经按照说明创建了一个war文件,当我将其部署到Tomcat 7时——静态内容丢失了,只显示了Thymeleaf html模板。

  • 作为一个新的Web应用程序项目的一部分,我计划学习Spring。我开始通读Spring框架参考。当我在谷歌上搜索时,我遇到了Spring boot。我所理解的是,Spring boot通过减少配置帮助构建应用程序的速度比Spring快得多。现在我有点困惑,我应该继续学习Spring还是跳转到Spring boot。我的目的是了解Spring作为一个框架是如何工作的,而不是一些特性。所以请让我知道,

  • 我正在使用Spring boot 2.0.2应用程序通过HTTPS对外部api进行REST api调用。 我是TLS和SSL的新手。我的理解是,TLS是一种更安全的方式,用于传输安全的敏感数据。 我的问题是: 如何确定我的应用程序使用的TLS版本

  • 我有两个项目。我用Angular2 cli构建的Angular2应用程序和只为Angular2应用程序服务的Spring Boot应用程序。我用构建Angular2应用程序,它会生成一个文件夹。然后,我将文件夹的内容放在Spring Boot应用程序的中。 我的Spring启动应用程序有两个文件。 Spring Boot应用程序类: 及其应用。属性文件: 它工作得很好,但是如果我转到一个url并点

  • 我正在练习使用spring boot来处理restful应用程序 我已经设置了@RestController和@Entity这样 和 当我用邮递员http://localhost:8080/cardatabase/api/cars我有一张汽车清单 但即使我去http://localhost:8081/cardatabase/cars,顶部嵌入 正常吗? 谢谢

  • 我在下面的链接中添加了过滤器作为问题的答案 Spring Boot Data Rest+CORS不能正确启用选项/删除