将 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
。
我正在使用 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
。