Feign 和 HAL/资源

2024-01-20

我有一个通过 spring-data-rest 公开资源的服务器,据我所知,它使用 HAL 或 HATEOAS。但是当我尝试将它与 Feign 结合使用时,我似乎无法注册一个被拾取的 Jackson2HalModule 。

我需要做些什么才能将 Feign“客户端”连接到新转换器吗?它是否使用了我这里使用的另一个 ObjectMapper?

Code:

@Inject
public void configureObjectMapper(ObjectMapper mapper, RestTemplate template) {
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.registerModule(new Jackson2HalModule());

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
    converter.setObjectMapper(mapper);

    template.getMessageConverters().add(converter);
}

服务器响应:

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:13372/user{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:13372/user/search"
    }
  },
  "_embedded" : {
    "user" : [ {
      "id" : "5567613e5da543dba4201950",
      "version" : 0,
      "created" : "2015-05-28T18:41:02.685Z",
      "createdBy" : "system test",
      "edited" : "2015-05-28T18:41:02.713Z",
      "editedBy" : "system test",
      "username" : "devuser",
      "email" : "[email protected] /cdn-cgi/l/email-protection",
      "roles" : [ "USER" ],
      "_links" : {
        "self" : {
          "href" : "http://localhost:13372/user/5567613e5da543dba4201950"
        }
      }
    } ]
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

例外:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
 at [Source: java.io.PushbackInputStream@7b6c6e70; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:762)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:758)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:275)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:216)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:206)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2221)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:205)

我发现了问题。 发生异常的原因是来自 REST API 的响应是单个响应。所以它未能将其视为实体列表。

当我添加时(基于上面的代码):

mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

It works

编辑: 附带说明一下,我实现了 FeignClient,如下所示:

@Service
@FeignClient(UsersConstants.USER_SERVICE_NAME)
public interface UsersServices {

    @RequestMapping(method = RequestMethod.GET, value = "/user")
    List<User> getUsers();
}

但它应该如何,因为它是可分页资源:

@Service
@FeignClient(UsersConstants.USER_SERVICE_NAME)
public interface UsersServices {

    @RequestMapping(method = RequestMethod.GET, value = "/user")
    List<PagedResources<User>> getUsers();
}

PagedResource 可在 HATEOAS 依赖项中找到:

<dependency>
    <groupId>org.springframework.hateoas</groupId>
    <artifactId>spring-hateoas</artifactId>
</dependency>

它还具有许多其他可以提供帮助的类,例如 Resource、Resources 等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Feign 和 HAL/资源 的相关文章

随机推荐

  • 如何在 Asp.Net Core 2.2 中禁用/启用运行时身份验证?

    网站默认只能匿名访问 管理员有一个按钮可以将站点切换到维护模式 这应该使用内置的 Cookie 身份验证启用授权 在数据库中稍微翻转一下 与本文无关 为了实现这一点 我首先配置了 cookie 身份验证 在startup cs中 publi
  • 如何在 MVC 3 中的 PartialView 加载上执行 JavaScript 函数

    code public ActionResult mapPartial DataTable dt string strEvents foreach DataRow row in dt Rows strEvents row Lat ToStr
  • dijit.byId 不适用于 IE8 和 dojo.addOnLoad

    当我使用 IE8 加载此脚本时 出现异常Object does not support this property or method 但它适用于其他浏览器 我用的是dijit 1 3 1 我不明白 dojo addOnLoad init
  • 如何将使用事务的代码包装在事务中然后回滚?

    我正在设置我的集成测试设备 我正在使用beforeEach and afterEach挂钩将每个测试包装在回滚的事务中 以便测试不会相互影响 一个简化的例子可能是这样的 const repository require library de
  • 如何从左到右解压元组?

    有没有一种干净 简单的方法来从左到右解压右侧的Python元组 例如对于 j 1 2 3 4 5 6 7 1 2 3 4 5 6 7 v b n j 4 7 我可以修改切片符号以便v j 6 b j 5 n j 4 我意识到我可以只订购左侧
  • React js:无法将数组中的第一个对象作为道具发送

    我正在尝试构建一个小型 React js 应用程序 我的组件结构如下所示 MainComponent CategoryList Category ItemsList Item 我的 MainContent 组件对其状态数据执行 ajax 请
  • 如何找到最接近的旋转

    考虑从 0 T 开始按递增顺序给出的点 Y 我们将这些点视为位于圆周 T 的圆上 现在考虑点 X 也来自 0 T 并且也位于圆周 T 的圆上 我们说 X 和 Y 之间的距离是 X 中每个点与其 Y 中最近点之间的绝对距离之和 回想一下 两者
  • 将滚动平均值与数据一起绘制

    我有一个看起来像这样的数据框 delays Worst case Avg case 2014 10 27 2 861433 0 953108 2014 10 28 2 899174 0 981917 2014 10 29 3 080738
  • 检测语言的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是否可以使用循环创建同一组件的多个实例?

    我有一个组件 Component CAU is port CLK in std logic RESET in std logic START in std logic V DIRECTION in vector 3d P ORIGIN in
  • 如何在 ZF2 中创建表单输入/元素

    编辑 我的主要问题现在变成了 如何以某种干净的方式将带有学说实体管理器的 ServiceManager 交到我的表单 元素和输入类手中 继续阅读以查看完整的帖子 我将尝试在这里举例询问 所以请耐心等待 让我知道哪里做错 对了 或者哪里可以改
  • 是否有用于布尔运算的内置“并行”函数?

    我正在寻找类似的功能pmax and pmin但对于布尔运算 例如 parallel and c TRUE TRUE TRUE TRUE c TRUE TRUE TRUE FALSE c TRUE TRUE FALSE TRUE c TRU
  • 在 C++ 中的结构上使用 memset

    我正在努力为我的工作修复旧代码 目前它是用 C 编写的 他们将静态分配转换为动态分配 但没有编辑 memsets memcmp memcpy 这是我的第一次编程实习 所以我的问题就像新手一样 以下代码是用 C 编写的 但我想用 C 编写 我
  • 使用 Python 更新 terraform (.tf) 文件

    我正在尝试使用 python 更新 terraform 模板 尽管我在尝试查找模块时遇到一些问题 例如使用 PyYAML 来更新 yml 文件 我的目标是更新 git 存储库中存在的 terraform 文件 并创建拉取请求 合并时将触发管
  • 如何使用 SDL 2.0.9 创建 Direct3d 11 渲染器

    在我的项目中我必须使用SDL BLENDOPERATION MAXIMUM via SDL ComposeCustomBlendMode 仅在 SDL 2 0 9 中由 direct3d11 渲染器支持 我有 Windows 8 1 和 G
  • array_multisort() 不修改第一个参数中的数组

    我正在尝试排序 ar1按降序排列的值 ar2 什么也没发生 ar1 array arperc ar2 array arid array multisort ar1 ar2 print r ar1 我缺少什么 如果您想使用以下元素 ar2作为
  • 在 R 中同时记录 stdout + stderr 和 stderr

    我想拥有一切stdout stderr在一个日志文件中 同时stderr在另一个 我怎样才能在 R 中实现这一目标 消息必须保留两个日志中所有消息的时间顺序 例如我有以下代码 options warn 1 cat 1st stdout n
  • React Native 中的快速刷新始终完全重新加载应用程序

    这个问题已经在这里被问过好几次了 这是最相关的 https stackoverflow com questions 59424152 fast refresh that was introduced in react native 0 61
  • 通过 CURL 将 Zip 文件下载到文件结构中的实际 Zip 文件

    我正在尝试使用 RubyGem Curb 构建一个文件下载器 看着这个问题 https stackoverflow com questions 5382149 using gem curb curl to download file 我正在
  • Feign 和 HAL/资源

    我有一个通过 spring data rest 公开资源的服务器 据我所知 它使用 HAL 或 HATEOAS 但是当我尝试将它与 Feign 结合使用时 我似乎无法注册一个被拾取的 Jackson2HalModule 我需要做些什么才能将