首页 > 解决方案 > 休息控制器响应页面返回空对象

问题描述

我使用 Spring Data Pageable 来实现分页和排序。我的相关代码片段是:

    //GET API designed as POST due to Request Body, in lines of ES APIs
    @PostMapping(value = "/v2")
    public Page<ObjectDto> getObjects(@RequestBody @Valid Map<Integer, FilterRequestDto> filterDtoMap, Pageable pageable) {
        Page<ObjectDto> objectDtos = myService.getDtos(filterDtoMap, pageable);
        log.info(String.valueOf(objectDtos.getTotalElements()));
        return objectDtos;
    }

虽然我有数据(从日志中确认),但上述 API 以{}响应。

但是,当我在这个片段中返回 List 时:

    @PostMapping(value = "/v2")
    public List<ObjectDto> getObjects(@RequestBody @Valid Map<Integer,FilterRequestDto> filterDtoMap, Pageable pageable) {
        Page<ObjectDto> objectDtos = myService.getDtos(filterDtoMap, pageable);
        log.info(String.valueOf(objectDtos.getTotalElements()));
        return objectDtos.getContent();
    }

对完全相同的 API 的 List 返回类型的响应是预期的正确响应:

[ {“salesPrice”:23000,“id”:1,“version”:1,“createdOn”:“2019 年 2 月 25 日,05:53”,“lastUpdatedOn”:“2019 年 2 月 25 日,05:53”}]

存储库代码:

@Repository
public interface MyObjectRepository extends JpaRepository<MyObject, Long>, JpaSpecificationExecutor<MyObject> {}

服务代码:

public Page<ObjectDto> getTyres(Map<Integer, FilterRequestDto> filterDtoMap, Pageable pageable) {
        List<FilterDto> filterDtoList = filtersService.getAllFiltersById(filterDtoMap.keySet());
        return objectMapper.toDto(myObjectRepository.findAll(ObjectSpecs.filter(filterDtoList, filterDtoMap), pageable));
    }

据我所知,我们可以将页面作为 Rest API 响应返回,那么这里有什么问题呢?任何帮助都感激不尽。

标签: javaspring-bootspring-datahttpresponsespring-restcontroller

解决方案


Don't use Page<ObjectDto> as return type of rest methods. This Page is not for that. use return type as List<ObjectDto>

and in log you are printing

log.info(String.valueOf(objectDtos.getTotalElements()));

so its printing properly, if you return objectDtos.getTotalElements() in rest method then it will also work


推荐阅读