【问题标题】:NoSuchFieldError "ADJUST_DATES_TO_CONTEXT_TIME_ZONE" when trying to parse json尝试解析 json 时出现 NoSuchFieldError "ADJUST_DATES_TO_CONTEXT_TIME_ZONE"
【发布时间】:2020-01-29 22:58:00
【问题描述】:

我想使用 jackson 将包含日期的 json 字符串转换为 jodaTime 的 DateTime。不幸的是我收到了这个错误

java.lang.NoSuchFieldError: ADJUST_DATES_TO_CONTEXT_TIME_ZONE

json 对象如下所示:

{
"add_time": "2017-04-26 14:26:58",
}

我在 pom.xml 中包含了 joda time 和 jackson,如下所示:

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
            <version>${jackson.version}</version>
        </dependency>

jackson 版本是 2.8.8。 我以这种方式创建了我的对象映射器:

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JodaModule());

有人知道问题可能是什么吗?我现在坚持了几个小时。我也试过禁用DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE,但没有帮助。

【问题讨论】:

    标签: java jackson jodatime


    【解决方案1】:

    NoSuchFieldError是jackson库端类结构不兼容导致的,需要查看jackson系列的finally解决的库版本。

    【讨论】:

      【解决方案2】:

      在我的情况下,问题非常简单——从堆栈跟踪中,我在 JacksonJodaDateFormat 第 124 行中找到了问题所在的行:

      Exception in thread "main" java.lang.NoSuchFieldError: ADJUST_DATES_TO_CONTEXT_TIME_ZONE
          at com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat.with(JacksonJodaDateFormat.java:124)
          at com.fasterxml.jackson.datatype.joda.ser.JodaDateSerializerBase.createContextual(JodaDateSerializerBase.java:95)
          at com.fasterxml.jackson.databind.SerializerProvider.handleSecondaryContextualization(SerializerProvider.java:956)
          at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:536)
          at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.resolve(BeanSerializerBase.java:320)
          at com.fasterxml.jackson.databind.ser.SerializerCache.addAndResolveNonTypedSerializer(SerializerCache.java:197)
          at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1177)
          at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:490)
          at com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap.findAndAddSecondarySerializer(PropertySerializerMap.java:90)
          at com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase._findAndAddDynamic(AsArraySerializerBase.java:312)
      

      所以在 IntelliJ Idea 中反编译文件后,我得到了这个:

      我发现我的 com.fasterxml.jackson.annotation 包中的 JsonFormat 版本不包含 Feature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE。缺失的值实际上是在https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations 包中,所以在我将包导入 maven 后(确保您与核心 Jackson 导入的版本相同),一切都开始工作了。这是导入:

      <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.9.5</version>
      </dependency>
      

      【讨论】:

      • 添加jackson-annotations 依赖解决了问题
      【解决方案3】:

      您需要指定自定义日期时间格式,因为 JSON 中的格式不是 Jackson 所期望的。您可以通过字段或 setter 方法上的 @JsonFormat 注释轻松做到这一点(无需禁用 ADJUST_DATES_TO_CONTEXT_TIME_ZONE)。例如

      @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
      DateTime addTime;
      

      您示例中的日期将被解析为2017-04-26T14:26:58.000Z。顺便说一下,这是 Jackson 所期望的默认格式。

      如果您不想添加注释,您可以查看自定义反序列化器,但这更复杂。

      【讨论】:

      • 您的方法没有帮助。我仍然得到异常。
      • Jackson 解析此日期需要日期时间格式。您报告的异常表明 ADJUST_DATES_TO_CONTEXT_TIME_ZONE 在您使用的 Jackson 版本中不可用。但是您不需要使用我回答中的方法禁用或启用它。所以你可以删除这个配置,你不会得到这个特殊的异常。如果您出于其他原因需要对此进行配置,则必须确认您使用的是 Jackson 版本 >= 2.2
      • 我不怀疑你在说什么。我试过了。我添加了@JsonFormat 并删除了禁用 ADJUST_DATES_TO_CONTEXT_TIME_ZONE 的代码。您的建议可能会阻止我在解决异常时遇到的错误,但现在我仍然收到此异常。
      【解决方案4】:

      也许您需要 ZonedDateTime 的反序列化器?我遇到了和你一样的错误,用下面的代码解决了(注意:我用的是 Jackson 2.9.2):

      SimpleModule module = new SimpleModule();
      module.addDeserializer(ZonedDateTime.class, new ZonedDateTimeDeserializer());
      mapper.registerModule(module);
      

      ZonedDateTimeDeserializer:

      public class ZonedDateTimeDeserializer extends StdDeserializer<ZonedDateTime> {
      ...
      @Override
      public ZonedDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
          JsonNode node = jp.getCodec().readTree(jp);
          String zonedDateTime = node.textValue();
          return ZonedDateTime.parse(zonedDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd' 'HH:mm:ss"));
       }
      } 
      

      (我意识到这个问题我有点晚了,但我希望它可以帮助某人)

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 2011-02-16
        相关资源
        最近更新 更多