最近在使用spring引导应用程序(在我的情况下不是Web应用程序)中使用feign客户端时,我发现客户端无法正确反序列化对象。正如同事指出的那样 - 事实证明,由于HAL模块注册是由spring auto configuration of hateos上的@ConditionalOnWebApplication有条件保护的
知道这一点后,可以采用解决方案来克服这个问题
所以现在知道这有没有遇到过这个?我觉得拥有Jpa休息资源的假装客户端是一个有效的方案。
下面是一个服务器响应示例,它是一个Paged。请注意下面收到的响应中的元数据内容(有一个结果)但没有修复当我尝试读取分页资源的内容时,它会变成空/空
{
"_embedded": {
"emails": [{
"id": "1a5edced-c165-4209-9d1c-9549b6841d13",
"tenantId": "a56982a6-6e12-4fe6-95d1-b735cedda2dc",
"email": "whatever@whatever.com",
"_links": {
"self": {
"href": "http://10.190.224.138:8086/emails/1a5edced-c165-4209-9d1c- 9549b6841d13"
},
"email": {
"href": "http://10.190.224.138:8086/emails/1a5edced-c165-4209-9d1c-9549b6841d13"
}
}
}]
},
"_links": {
"self": {
"href": "http://10.190.224.138:8086/emails/search/whatssss?email=whatever%40whatever.com"
}
},
"page": {
"size": 20,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}
答案 0 :(得分:2)
Spring Boot在您尝试提供超媒体的前提下自动配置超媒体支持,而不是纯粹使用它。
如果您认为需要自动配置各种客户端,我建议针对Spring Boot打开一个问题,详细说明Boot团队如何以及为何能够正确响应。
鉴于这一切,消费超媒体就像:
Traverson client = new Traverson(/* baseUri */, MediaTypes.HAL_JSON); // set up for HAL
...或...
@Configuration
@EnableHypermediaSupport({HypermediaType.HAL})
class ConfigureHypermediaInMyClient {
@Bean
RestOperations restOperations() {
return new RestTemplate();
}
}
第一个场景将创建一个Traverson实例,用于跳转rel-to-rel,并使用HAL。后者将在应用程序上下文中注册RestTemplate的实例,然后在支持HAL的情况下装饰该实例。
重要:无论何时使用@EnableHypermediaSupport,Spring Boot都会丢弃自己的自动配置详细信息以尊重您的身份。仅建立客户?很好,因为自动配置以服务器端为中心。建立自己的服务器?然后准备好进行完整配置。
Feign怎么样? Spring Boot和Spring HATEOAS都没有直接支持Feign。要让Feign消耗HAL等,需要自定义设置。鉴于Feign旨在进行RPC调用并且以URI为中心,跨链接跳跃可能不是最佳用法。看一下Traverson的东西,看看是否更符合您的要求。
P.S。根据{{3}},您也可以选择支持HAL-FORMS。
答案 1 :(得分:0)
你自己提出的第一个答案对我有意义,只需在你的项目中添加所需的依赖项并再试一次,它应该有效。另一方面,第二个似乎真的是一个坏主意,你永远不应该认为改变你的应用程序完全只支持任何库