将 HttpRequestExecutingMessageHandler 的 expectedResponseType 设置为页面

Set the HttpRequestExecutingMessageHandler's expectedResponseType to a Page

我正在使用 MessagingGateway 对其他服务执行 HTTP 调用。 这个端点 returns 数据的一部分(使用分页),问题是返回的结果是类型 Page which is an interface. I know that the implementation of that interface is a class of type PageImpl 但问题是当我试图反序列化它时,这个 class 没有任何默认构造函数,因此失败。我可以创建一个包含所需 属性 的 POJO,这将解决问题,但我想知道是否有任何 spring 技巧可以让我以更好的方式解决这个问题。

这是我的消息网关配置示例:

    Map<String, Expression> uriVariableExp = getDefaultEndpointProperties(host, apiKey);
    SpelExpressionParser parser = new SpelExpressionParser();

    uriVariableExp.put("parameter1", parser.parseExpression("payload.parameter1"));
    String endpoint =
            "{host}/resource?parameter1={parameter1}";

    HttpRequestExecutingMessageHandler gateway = new HttpRequestExecutingMessageHandler(endpoint, getRestTemplate());
    gateway.setRequiresReply(true);
    gateway.setHttpMethod(HttpMethod.GET);
    ParameterizedTypeReference<Page<ResourceModel>> typeReference = new ParameterizedTypeReference<Page<ResourceModel>>(){};
    gateway.setExpectedResponseTypeExpression(new ValueExpression<>(typeReference));
    gateway.setUriVariableExpressions(uriVariableExp);
    return gateway;

如您所见,expectedResponseType 是我的问题,我尝试使用 PageImpl 但这抛出了找不到构造函数的错误。

不,没有这样的内置技巧。更糟糕的是:您的客户端 HttpRequestExecutingMessageHandler 一定不知道服务器的型号,并且其类路径中没有任何 Spring 数据罐。从大的高度说REST服务不应该return这样的模型进入响应。不仅您的应用程序可能是它的客户端。

既然你已经遇到了这样的问题,你别无选择,除非引入一些 VO POJO 能够正确反序列化 Page,或者实现你自己的 HttpMessageConverter 来有一个钩子根据 Spring 数据的要求实例化 PageImpl