0

最近在 Spring Boot 应用程序(在我的情况下不是 Web 应用程序)中使用 feign 客户端时,我看到客户端无法正确反序列化对象。正如一位同事向我指出的那样 - 原来是由于 HAL 模块注册是由 @ConditionalOnWebApplication 在 hatos 的spring 自动配置上有条件地保护的

知道这一点后,可以制定解决方案来克服这一点

  1. 我们可以向包含已注册 HAL 模块的 ObjectMapper 的 feign 客户端添加一个解码器(一小段代码,但仍然需要额外的工作)
  2. 转换为 Web 应用程序 - 我觉得这根本不是一个好的解决方案,不应该在使事情开箱即用的要点上完成。

那么现在知道这个有没有人遇到过这个?我觉得有一个 Jpa 休息资源的假客户端是一个有效的场景。

下面是一个分页的服务器响应示例。注意下面收到的响应中的元数据内容(有一个结果),但是当我尝试读取分页资源的内容时没有修复它会变成空/空

        {
        "_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
        }
    }
4

2 回答 2

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 都会丢弃它自己的自动配置细节,以尊重你的。只建立一个客户端?很好,因为自动配置以服务器端为中心。建立自己的服务器?然后准备好进行完整配置。

菲恩呢?目前,Spring Boot 和 Spring HATEOAS 都没有直接支持 Feign。让 Feign 使用 HAL 等需要自定义设置。鉴于 Feign 旨在进行 RPC 调用并且以 URI 为中心,跨链接跳跃可能不是其最佳用途。看看 Traverson 的东西,看看这是否更符合您的要求。

PS 根据https://spring.io/blog/2018/01/12/building-richer-hypermedia-with-spring-hateoas,您也可以选择加入 HAL-FORMS 支持。

于 2018-01-19T15:58:15.143 回答
0

您自己提出的第一个答案对我来说很有意义,只需在项目中添加所需的依赖项并重试,它应该可以工作。另一方面,第二个似乎真的是个坏主意,你永远不应该仅仅为了支持任何库而改变你的应用程序

于 2016-07-18T11:29:17.513 回答