【问题标题】:Date parsing problem with Jackson 1.8.5Jackson 1.8.5 的日期解析问题
【发布时间】:2011-11-24 01:08:01
【问题描述】:

最近(在过去几个小时左右)我开始得到这个异常堆栈:

org.codehaus.jackson.JsonParseException: Numeric value (1316835995324) out of range of int
 at [Source: java.io.StringReader@5b082d45; line: 1, column: 642]
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1291)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
    at org.codehaus.jackson.impl.JsonNumericParserBase.convertNumberToInt(JsonNumericParserBase.java:462)
    at org.codehaus.jackson.impl.JsonNumericParserBase.getIntValue(JsonNumericParserBase.java:257)
    at org.codehaus.jackson.map.deser.StdDeserializer._parseInteger(StdDeserializer.java:237)
    at org.codehaus.jackson.map.deser.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:838)
    at org.codehaus.jackson.map.deser.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:825)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:356)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:120)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:97)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:120)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:97)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:120)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:97)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.ObjectReader._bindAndClose(ObjectReader.java:477)
    at org.codehaus.jackson.map.ObjectReader.readValue(ObjectReader.java:253)

在反序列化 java.util.Date 时会发生这种情况。有趣的是,在此之前的输入流中还有其他类似的Dates,它们不会引起任何问题。另外,我没有更改正在序列化和反序列化的对象的字段。

有谁知道为什么 Jackson 试图将这个特定的 Date 值反序列化为 int(而不是 long)?

提前感谢您的任何见解。

编辑:我对此进行了一点调试,看起来这是 Jackson 尝试处理的第一个 Date,尽管它仍然在流中稍后出现。我还看到 Jackson 试图将这个数字强制转换为 int,尽管在处理的早期它被正确检测为 long

编辑 2:我对此进行了更多调试,并得出以下结论:只要我没有接受输入参数的设置器,序列化/反序列化就可以正常工作,如下所示:

public void setSomeValue(int param)
{
    // stuff
    this.date = <result_value>
}

在我介绍这个 setter 的那一刻,Jackson 执行了不同的代码路径并最终进入了尝试将 longjava.util.Date)放入 int 的块中。

编辑 3:将 setter 名称更改为与字段名称无关的名称可以解决此问题。我仍然希望知道原始方式是否按预期工作(如果是,其背后的想法是什么)或错误。

【问题讨论】:

    标签: java json date jackson


    【解决方案1】:

    Right -- 预期的类型由具有最高优先级的 mutator 确定。因此,由于您的 setter 声明类型是“int”,这就是杰克逊对待它的方式。它实际上必须,因为它会调用那个 setter;因此,即使您碰巧有一个不同类型的字段(或返回 Date 的 getter),它也无济于事,因为您不能将 Date 作为“int”传递给 set 方法。

    INT_MIN int 类型变量的最小值。 –2147483648

    INT_MAX int 类型变量的最大值。 2147483647

    【讨论】:

    • int 只是一个传递给设置器的参数,用于计算Date。我没有考虑到它会影响反序列化的处理(我已经在字段本身上有一个@JsonProperty 注释)。如果我做对了,该对象将作为 Bean 处理(即使它可能不是),因此 getter 和 setter 的语义。我现在想到使用@JsonIgnore 也有帮助。无论如何,感谢您阅读并提供解释。
    • 没问题。真正决定它的是片段的优先级:方法确实比字段具有更高的优先级,因为这允许通过添加访问器来“覆盖”字段。希望这有助于前进。
    • 感谢您的评论。由于我从您的解释中了解到我的“解决方法”(在我的“编辑 3”中)实际上是我打算做的(即不将该函数视为某些设置器),所以我保持原样并且它现在工作正常。
    【解决方案2】:

    是的,检查设置器,将 int 更改为 long:

    public void setSomeValue(long param)
    {
         this.date = param;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      相关资源
      最近更新 更多