Проблема разбора даты с Джексоном 1.8.5 - PullRequest
3 голосов
/ 24 сентября 2011

Недавно (в последние пару часов или около того) я начал получать этот стек исключений:

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. Интересная часть состоит в том, что есть другие подобные Date во входном потоке до этого, и они не вызывают никаких проблем. Кроме того, я не изменил поля сериализуемого и десериализованного объекта.

Кто-нибудь знает, почему Джексон пытается десериализовать это конкретное значение Date в int (а не в long)?

Заранее благодарим за понимание.

РЕДАКТИРОВАТЬ: Я немного отладил это, и похоже, что это первый Date, который пытается обработать Джексон, хотя это все еще происходит позже в потоке. Я также видел, что Джексон пытается ввести это число в int, хотя ранее при обработке оно правильно распознается как long.

РЕДАКТИРОВАТЬ 2: Я отладил это и выяснил следующее: Сериализация / десериализация работает нормально, пока у меня нет установщика, который принимает входной параметр, например так:

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

В тот момент, когда я представляю этот установщик, Джексон выполняет другой путь кода и попадает в блок, где он пытается поместить long (java.util.Date) в int.

РЕДАКТИРОВАТЬ 3: Изменение имени установщика на имя, не связанное с именем поля, решает проблему. Я все еще предпочел бы знать, работает ли оригинальный способ как задумано (если так, в чем идея), или ошибка.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Право - ожидаемый тип определяется мутатором с наивысшим приоритетом. Так как ваш сеттер утверждает, что типом является 'int', Джексон относится к нему. Это действительно необходимо, так как он будет вызывать этот сеттер; так что даже если у вас есть поле с другим типом (или метод получения, который возвращает Date), это не очень поможет, так как вы не можете передать Date как int для метода set.

INT_MIN Минимальное значение для переменной типа int. - 2147483648

INT_MAX Максимальное значение для переменной типа int. 2147483647

0 голосов
/ 26 апреля 2016

Да, проверьте сеттер, измените int на long:

public void setSomeValue(long param)
{
     this.date = param;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...