将客户端(在非Web环境中)假设为带有HAL的RepostoryRestResource - 是无效的用例吗?

时间:2016-07-13 21:08:55

标签: spring-boot spring-data spring-rest spring-cloud-feign feign

最近在使用spring引导应用程序(在我的情况下不是Web应用程序)中使用feign客户端时,我发现客户端无法正确反序列化对象。正如同事指出的那样 - 事实证明,由于HAL模块注册是由spring auto configuration of hateos上的@ConditionalOnWebApplication有条件保护的

知道这一点后,可以采用解决方案来克服这个问题

  1. 我们可以在feign客户端添加一个解码器,它包含ObjectMapper,它有一个注册的HAL模块(一小段代码,但还有额外的工作)
  2. 转换为网络应用程序 - 我认为这根本不是一个好的解决方案,而且应该在让开箱即用的工作中完成。
  3. 所以现在知道这有没有遇到过这个?我觉得拥有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
            }
        }
    

2 个答案:

答案 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)

你自己提出的第一个答案对我有意义,只需在你的项目中添加所需的依赖项并再试一次,它应该有效。另一方面,第二个似乎真的是一个坏主意,你永远不应该认为改变你的应用程序完全只支持任何库