由于jackson-databind版本不匹配导致的序列化错误?

时间:2015-10-26 15:51:50

标签: maven serialization dropwizard jackson-modules

我遇到了以下错误

java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS
    at com.fasterxml.jackson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:28)
    at com.fasterxml.jackson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:25)
    at com.fasterxml.jackson.datatype.joda.JodaModule.<init>(JodaModule.java:45)

我查看了哪些版本的jackson-datatype-joda可用。似乎maven排除了所有版本不匹配。

这可能导致序列化错误吗?

3 个答案:

答案 0 :(得分:10)

问题是,在maven依赖项中(请注意它可能是一个传递的依赖项),您有 jackson-datatype-joda jackson-databind 的不兼容版本。在 jackson-databind SerializationFeature 类缺少 WRITE_DURATIONS_AS_TIMESTAMPS 字段的意义上不兼容。要查看maven带来的依赖关系,您可以在终端中运行以下命令(或者您可以使用IDE的maven插件来搜索和分析maven依赖关系树):

mvn dependency:tree | grep databind

结果很可能是:

[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.4.1:compile

课程版本可能有所不同,但重要的是 WRITE_DURATIONS_AS_TIMESTAMPS 字段仅在版本 2.5

时可用

您可以排除这样的传递依赖:

<dependency>
  <groupId>group.id</groupId>
  <artifactId>artifact-id</artifactId>
  <version>${artifact.version}</version>
  <exclusions>
    <exclusion>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
    </exclusion>
  </exclusions>
</dependency>

如果不是传递依赖,则需要更新 jackson-databind 的版本。

答案 1 :(得分:3)

我通过使用以下依赖项解决了这个问题,因为此依赖项已覆盖使用的任何其他版本:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-joda</artifactId>
    <version>2.5.3</version>
</dependency>

答案 2 :(得分:0)

我有同样的错误。我在WEB-INF / lib /下包含了所有jackson * 2.7.0库,但我仍然遇到了这个错误。我正在使用wildfly 8.2并且它在模块下有jackson 2.4.1库,不知何故它从该位置加载了2.4.1个jar。所以我不得不手动将它们升级到2.7.0,这解决了问题。我的印象是,如果我没有提到它在部署配置文件中加载jackson jar,它就不会加载wildfly jar。我想我错了。