【问题标题】:Set the HttpRequestExecutingMessageHandler's expectedResponseType to a Page将 HttpRequestExecutingMessageHandler 的 expectedResponseType 设置为 Page
【发布时间】:2016-05-28 01:38:47
【问题描述】:

我正在使用 MessagingGateway 对另一个服务执行 HTTP 调用。 这个端点返回一个数据片段(使用分页),问题是返回的结果是Page类型的,它是一个接口。我知道该接口的实现是PageImpl 类型的类,但问题是当我尝试反序列化它时,该类没有任何默认构造函数,因此它失败了。我可以创建一个包含所需属性的 POJO,这将解决问题,但我想知道是否有任何弹簧技巧可以让我以更好的方式解决这个问题。

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

    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 但这会抛出找不到构造函数的错误。

【问题讨论】:

    标签: java spring-data spring-integration spring-data-rest


    【解决方案1】:

    不,没有这样的内置技巧。更糟糕的是:您的客户端HttpRequestExecutingMessageHandler 一定不知道服务器的模型,并且在其类路径中没有任何 Spring Data jar。从高处看,REST 服务不应该将这样的模型返回到响应中。不仅您的应用程序可能是它的客户端。

    由于您已经遇到这样的问题,您别无选择,除非引入一些 VO POJO 以便能够正确反序列化 Page,或者实现您自己的 HttpMessageConverter 以具有将 PageImpl 实例化为的钩子它是 Spring Data 所要求的。

    【讨论】:

    • 既然您指出 REST 服务不应该返回这样的模型,我想知道在 spring data rest 中公开存储库是否是一个好的决定,它们确实返回一个“页面”。既然他们正在这样做,我希望它可以从其他 spring-* 框架中使用,例如 spring 集成。
    • 好吧,也许您应该遵循 Spring Data REST 建议并改用 new PagedResourcesType&lt;Resource&lt;ResourceModel&gt;&gt;() {}?在那里查看样品github.com/spring-projects/spring-data-examples/tree/master/…。真的不确定我们是否应该将任何开箱即用的东西添加到 Spring Integration 中,因为无法保证您希望如何表示该模型。
    • 我只是在看代码,看到了 PagedResources 类。感谢您的帮助,我将重新审视我们的服务分页策略,因为正如您指出的那样,公开 Page 实现似乎真的是错误的。
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多