当前位置: 首页 > 面试题库 >

如何使用Spring RestTemplate消耗Page

范书
2023-03-14
问题内容

我正在使用spring数据(mongoDb),并且有我的存储库:

public interface StoriesRepository extends PagingAndSortingRepository<Story, String> {}

然后我有一个控制器:

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<Page<StoryResponse>> getStories(Pageable pageable) {
    Page<StoryResponse> stories = storiesRepository.findAll(pageable).map(StoryResponseMapper::toStoryResponse);
    return ResponseEntity.ok(stories);
}

一切正常,但我无法使用RestTemplate getForEntity方法使用端点:

def entity = restTemplate.getForEntity(getLocalhost("/story"), new TypeReference<Page<StoryResponse>>(){}.class)

我应该提供什么课程来成功反序列化实体页面?


问题答案:
new TypeReference<Page<StoryResponse>>() {}

该语句的问题在于,Jackson无法实例化抽象类型。你应该为Jackson提供有关如何实例化Page具体类型的信息。但是它的具体类型,PageImpl没有默认构造函数或与此相关的任何@JsonCreator,因此你也不能使用以下代码

new TypeReference<PageImpl<StoryResponse>>() {}

由于无法将所需的信息添加到Page类中,因此最好为Page接口创建一个自定义实现,该接口具有默认的无参数构造函数,如本答案所示。然后在类型引用中使用该自定义实现,如下所示:

new TypeReference<CustomPageImpl<StoryResponse>>() {}

这是从链接的问题中复制的自定义实现:

public class CustomPageImpl<T> extends PageImpl<T> {
    private static final long serialVersionUID = 1L;
    private int number;
    private int size;
    private int totalPages;
    private int numberOfElements;
    private long totalElements;
    private boolean previousPage;
    private boolean firstPage;
    private boolean nextPage;
    private boolean lastPage;
    private List<T> content;
    private Sort sort;

    public CustomPageImpl() {
        super(new ArrayList<>());
    }

    @Override
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    @Override
    public int getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }

    @Override
    public int getNumberOfElements() {
        return numberOfElements;
    }

    public void setNumberOfElements(int numberOfElements) {
        this.numberOfElements = numberOfElements;
    }

    @Override
    public long getTotalElements() {
        return totalElements;
    }

    public void setTotalElements(long totalElements) {
        this.totalElements = totalElements;
    }

    public boolean isPreviousPage() {
        return previousPage;
    }

    public void setPreviousPage(boolean previousPage) {
        this.previousPage = previousPage;
    }

    public boolean isFirstPage() {
        return firstPage;
    }

    public void setFirstPage(boolean firstPage) {
        this.firstPage = firstPage;
    }

    public boolean isNextPage() {
        return nextPage;
    }

    public void setNextPage(boolean nextPage) {
        this.nextPage = nextPage;
    }

    public boolean isLastPage() {
        return lastPage;
    }

    public void setLastPage(boolean lastPage) {
        this.lastPage = lastPage;
    }

    @Override
    public List<T> getContent() {
        return content;
    }

    public void setContent(List<T> content) {
        this.content = content;
    }

    @Override
    public Sort getSort() {
        return sort;
    }

    public void setSort(Sort sort) {
        this.sort = sort;
    }

    public Page<T> pageImpl() {
        return new PageImpl<>(getContent(), new PageRequest(getNumber(),
                getSize(), getSort()), getTotalElements());
    }
}


 类似资料:
  • 关于本指南:https://spring.io/guides/gs/consuming-rest/ 该指南展示了如何使用RESTful web服务。 REST API查询的响应产生以下JSON: 它创建一个名为Quote.java的域类来包含响应中的数据: 我的问题是如何代表以下json: 像和这样的外部对象很简单,但我不知道如何表示对象,它看起来像一个json对象数组。

  • 问题内容: 我试图检查Go如何处理100,000个goroutine。我写了一个简单的程序来产生许多例程,除了打印一些公告外什么也不做。我将MaxStack大小限制为只有512个字节。但是我注意到程序的大小并没有因此而减少。它消耗了大约460 MB的内存,因此每个goroutine消耗了大约4 KB的内存。我的问题是,我们可以将goroutine的最大堆栈大小设置为低于“最小”堆栈大小(可能为4

  • 我们使用的是Spring kafka 2.7非阻塞重试机制。在Spring Kafka重试机制中,Kafka listenser使用来自main topic、Retry topic和DLT topic的消息,我们希望侦听器仅使用来自main和Retry topic的消息。 有没有简单的方法来进行设置? 因为我们不希望同一个消费者处理DLT消息。DLT还将被另一个进程使用,以发送请求通知。

  • 我正在开发一个使用Spring Integration 5.0.1和Spring Boot 2.0.0的应用程序。RC1 目前,应用程序响应并运行一些可能需要一段时间才能完成的初始化代码。这不使用任何Spring集成组件。 我还有一些非常基本的集成流,使用JavaDSL编写,并在配置中声明为bean。 有什么方法可以推迟流何时开始消耗消息吗?我希望能够在初始化完成时手动启动它们。 配置似乎是解决方

  • 我正在尝试使用Cooja模拟器模拟无线传感器网络。我想观察RPL协议在Contiki-OS中消耗的内存量。我使用sky-mote进行模拟,并创建了一个包含许多它们的网络。有没有什么方法可以观察RPL协议为保留邻居和路由表而消耗的内存量?

  • 这种需求类似于通过公开的REST服务API(Spring Boot)处理来自死信队列的消息。以便一旦调用REST服务,就会从DL队列中消耗一条消息,并将再次发布到主队列中进行处理。@RabbitListener(queues=“queue_name”)立即使用消息,这在场景中是不需要的。该消息只需由REST服务API使用。有什么建议或解决办法吗?