Spring 与 Jackson ObjectMapper 和 Java 8 Time 集成 (JSR-310)

2023-11-30

我正在努力配置 Spring Integration DSL 转换器使用的“自定义”ObjectMapper。 我收到一个java.time.Instant我想将其解析为对象属性的 json 表示形式。 IE:
{“类型”:“测试”,“来源”:“测试”,“时间戳”:{“epochSecond”:1454503381,“纳米”:335000000}}

该消息是一条 kafka 消息,它提出了一个问题:我应该编写一个实现 Kafka 编码器/解码器的自定义序列化器,以便能够将 kafka 消息转换为正确的对象,还是 spring 集成必须自动执行此操作?

固件/依赖项和版本:
Spring Boot - 1.3.2.RELEASE
Spring 集成 Java Dsl - 1.1.1.RELEASE
FasterXml 杰克逊 - 2.6.5

我已按照 Jackson 文档将此 Java 配置添加到项目中:https://github.com/FasterXML/jackson-datatype-jsr310

@Configuration
public class IntegrationConfiguration {

    @Bean
    public JsonObjectMapper<JsonNode, JsonParser> jsonObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        return new Jackson2JsonObjectMapper(mapper);
    }
}

以及以下 Jackson JSR-310 工件:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.6.5</version>
</dependency>

根据 Spring 博客上的这篇文章,我什至不必注册新的 Java8 时间模块。https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#jackson-modules

这是我得到的例外:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class java.time.Instant]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: {"type":"TEST","source":"TEST","timestamp":{"epochSecond":1454503381,"nano":335000000}}; line: 1, column: 71] (through reference chain: my.app.MyDto["timestamp"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1106)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:296)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:133)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:258)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2764)
    at org.springframework.integration.support.json.Jackson2JsonObjectMapper.fromJson(Jackson2JsonObjectMapper.java:75)
    at org.springframework.integration.support.json.Jackson2JsonObjectMapper.fromJson(Jackson2JsonObjectMapper.java:44)
    at org.springframework.integration.support.json.AbstractJacksonJsonObjectMapper.fromJson(AbstractJacksonJsonObjectMapper.java:56)
    at org.springframework.integration.json.JsonToObjectTransformer.doTransform(JsonToObjectTransformer.java:78)
    at org.springframework.integration.transformer.AbstractTransformer.transform(AbstractTransformer.java:33)
    ... 74 more

解决:
问题是我预计 Spring 将检测 jackson-datatype-jsr310 原型并注册 JavaTimeModule,但事实并非如此,这完全没问题。 我们可以通过两种方法解决这个问题:
1. 如果我们按原样使用 Spring Boot 和 Spring Integration ,则可接受的答案。
2. 如果使用 Spring Integration Dsl,只需将 IntegrationConfiguration 类与 jsonObjectMapper() bean 一起保留并像这样使用它:

@Autowired
private JsonObjectMapper jsonObjectMapper;    

return IntegrationFlows
        .from(inboundChannel())
        .transform(Transformers.fromJson(myDto.class, jsonObjectMapper))
        ...

在强制 Spring Integration 使用 Spring Boot 的问题上,这与 Spring Boot 无关。

您只需要配置JsonToObjectTransformer与你的jsonObjetMapper():

@Bean
@Transformer(inputChannel="input", outputChannel="output")
JsonToObjectTransformer jsonToObjectTransformer() {
    return new JsonToObjectTransformer(jsonObjectMapper());
}

虽然没有注册的理由JsonObjectMapper作为一颗豆子。

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

Spring 与 Jackson ObjectMapper 和 Java 8 Time 集成 (JSR-310) 的相关文章

随机推荐

  • 检查字典中是否存在某个单词未找到任何单词

    我想查找字典是否包含该单词 来自列表的单词通过循环递增 如果您没有在下面收到问题评论 请提出建议 n int input d for i in range n text input split d text 0 text 1 list fo
  • C++ - 编译在调用 std::thread 中的重载函数时失败

    考虑以下场景 实用程序 h include
  • 使用 CreateProcessAsUser 将焦点集中到从系统服务启动的窗口

    我有一个系统服务 可以使用该方法启动应用程序CreateProcessAsUser 此服务使用模拟在活动会话中启动应用程序 应用程序正在按预期启动 我设法使用以下命令使窗口出现在前面 SetWindowPos this gt wndTopM
  • Excel 2007 VBA根据文本过滤器复制行x次

    我是 VBA 新手 无法理解最有效的方法 我正在寻找一种根据频率将数据复制到活动单元格下方的行中的方法 样本数据是这样的 Name Value Frequency Date Steve 10 Annual 01 03 2012 Dave 2
  • 是否有适用于 Java 的 HttpCahce 客户端库?

    我已经asked关于 android 的这个问题 但我将扩大问题范围以包括一般的 java 是否有任何库用于实现 Http 缓存 我想更有效地下载我的图像 尊重 If Modified Since etags 等 我确信有一个库可以将图像的
  • 根据字典替换文本

    我需要做一些类似于这篇文章的事情 但有所不同 这就是我问的原因 unix shell 用字典替换 我有一本字典 dict txt 它是用空格分隔的 内容如下 V7动力 B6 广达 从某种意义上说 第一列是键 第二列是值 我有一个用户文件 u
  • 2 个意图过滤器,1 个活动 - 哪个打开了它?

    有没有办法知道哪个 Intent Filter 负责启动一个在 AndroidManifest xml 中定义了两个 Intent Filter 的 Activity 我想要一套稍微不同的逻辑 但还不足以需要一个全新的活动 Thanks 没
  • 如何在 kivy 中按下按钮时更改按钮的背景颜色?

    我的应用程序有一个带有默认背景颜色的按钮 我只想将其背景颜色更改为另一种颜色on press事件 您可能会认为它类似于 html 的已访问和未访问的超链接 即当单击链接时 它会更改其颜色 我的尝试 usr bin kivy import k
  • 从评论中提取电话号码

    我有一个专栏 其中有评论 超过 5000 个案例 这些评论有文字 数字 日期等等 我需要从这些评论中获取电话号码 每条评论的电话号码都是随机的 所以LEFT MID or RIGHT不管用 我达到的最接近的结果是 Kutools EXTRA
  • 重新审视浮点比较

    这个话题在 StackOverflow 上已经出现过很多次了 但我相信这是一个新的话题 是的 我已经读过布鲁斯 道森的文章 and 每个计算机科学家都应该了解的浮点运算知识 and 这个很好的答案 据我了解 在典型的系统上比较浮点数是否相等
  • 为什么接口方法调用比具体调用慢?

    当我发现抽象类和接口之间的区别时 我想到了这个问题 在这个帖子我开始知道接口很慢 因为它们需要额外的间接 但我不知道接口需要什么类型的间接 而不是抽象类或具体类所需的间接类型 请澄清一下 提前致谢 有许多性能神话 有些可能在几年前是正确的
  • 如何使用 jQuery 防止 ajax 请求遵循重定向

    我使用 jQuery ajax 函数访问 Web 服务 但服务器没有返回带有描述问题的状态代码的响应 而是将请求重定向到带有 200 标头的页面 描述问题 我无法对此进行任何更改 因此我需要以某种方式在客户端上解决它 例子 请求转到某个未找
  • 如何使用Google Drive API获取最后修改的用户信息?

    In Google Apis Drive v2 Data File类它只提供最后修改用户的名称 如何获取用户的完整信息 如电子邮件 用户 ID 等 var service new DriveService auth Google Apis
  • 如何在 Mac OS ( OS X 10.10) 中安装 php-cgi 作为插件?

    我想在 My 上进行 PHP 工作Mac book 然而 我安装后PHP风暴 并告诉PHP解释器的位置 它会导致错误 php cgi not found Please ensure that configured PHP Interpret
  • 如何从 Visual Studio Team Services 将静态网站部署到 Azure

    我有一个想要部署的现有网站Azure using Visual Studio 团队服务 该网站由静态文件组成 不涉及 ASP NET 或其他任何内容 在 Visual Studio Team Services 中 我创建了一个执行的构建np
  • cv::add 在 openCV 中不起作用

    我尝试构建 10 帧的平均值 因此我尝试了 cv Mat frame outf resultframe1 resultframe2 VideoCapture cap 1 cap gt gt frame resultframe1 Mat ze
  • 重写 JS 中的图像构造函数?

    是否可以覆盖ImageJS 中的构造函数 因此 例如 每次new Image 创建后 一条消息会写入控制台吗 尝试这个 function var OriginalImage window Image window Image functio
  • Cocoa:带有用于切换选项卡的工具栏图标的选项卡视图

    各种首选项对话框 Safari Mail Xcode4 和任何使用 NSPreferences 的对话框 和 Xcode4 的组织器使用让人想起选项卡视图的东西 只不过它使用工具栏按钮在选项卡之间切换 这些按钮被 按下 实现这种选项卡视图的
  • 到期时自动刷新 ASP.NET 输出缓存

    我有一些昂贵的页面 我使用 ASP NET 输出缓存进行缓存 如下所示 OutputCache Duration 3600 VaryByParam none 显然 缓存将在 3600 秒 1 小时 后过期 下一个碰巧加载该页面的可怜人将不得
  • Spring 与 Jackson ObjectMapper 和 Java 8 Time 集成 (JSR-310)

    我正在努力配置 Spring Integration DSL 转换器使用的 自定义 ObjectMapper 我收到一个java time Instant我想将其解析为对象属性的 json 表示形式 IE 类型 测试 来源 测试 时间戳 e