簡體   English   中英

春季靴分頁

[英]Spring Boot Pagination

我面臨着分頁數據的問題。 使用外部數組dXPRecommendationResponses計算頁面數據,我希望通過嵌套數組recommendations計算該數據。 我在結果部分提到了響應數據。

我試圖更改頁面數據計算,但是它是使用我們在PageImpl()構造函數中傳遞的數據來計算的。

我已經使用這種方法對我們從第三方API獲取的數據進行分頁。

但是它是使用dxpRecommendationslist計算的。

#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
    }
}

這里的問題是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 因此完全忽略了您給的total 如果要重寫此行為,則應實現僅使用給定的total Page

但是,我認為這在語義上是不正確的。 您將可能不應該混合的東西混合在一起(一種類型的頁面對象,而另一種類型的實際分頁)。 作為可分頁列出的列表始終只有一個元素,而您正在分頁似乎不太正確的子元素,是否甚至需要對這些子元素進行分頁?

一種可能的解決方案是通過直接在DXPRecommendationResponse內部指定Page<DXPActivity> recommendations成員並返回不可分頁的DXPRecommendationResponse來使僅可分頁的子元素成為可能。 但是,這似乎有點偏離。 它確實取決於您要在此處構建的內容以及其背后的邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM