2016-06-24 2 views
0

У меня странная проблема с небольшим сервлетом, который использует Джерси и Гссона для сериализации/десериализации JSON. Я на самом деле скопировал базовый поставщик Gson, написанный для Джерси, как этот: http://eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/, и все, казалось, работало нормально, пока я не попытался десериализовать Date (в стандартном формате ISO 8601), который всегда отображается в моем POJO как null ,Джерси + Gson не десериализует java.util.Date

Моя первая попытка была зарегистрировать адаптер типа десериализатор перед возвращением экземпляра gsonBuilder, как это:

import java.util.Date; 

... 

gsonBuilder.registerTypeAdapter(Date.class, 
    new JsonDeserializer<Date>() { 
     @Override 
     public Date deserialize(JsonElement json, Type type, 
           JsonDeserializationContext arg2) throws JsonParseException { 
      try { 
       System.out.println(json); 
       return (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX")).parse(json.getAsString()); 
      } catch (ParseException e) { 
       return null; 
      } 
     } 
    }); 

Это не сработало, и ничего не печатается при отправке запроса POST. Я попытался использовать метод setDateFormat в экземпляре gsonBuilder перед его возвратом, но это ничего не изменило.

Я думал, что были какие-то другие классы, реализующие MessageBodyWriter и MessageBodyReader перекрывая свою собственную реализацию, поэтому я попытался удалить свою собственную реализацию и Джерси жаловался, что он был не в состоянии десериализации JSON (так что нет других поставщиков, Я полагаю).

Я попытался установить точки останова в методе readFrom в своем MessageBodyReader, но запрос фактически десериализуется без приостановки выполнения.

Следует отметить, что мой класс содержит также разные поля, некоторые строки и одну дату: строка всегда десериализована правильно.

Я попытался отправить разные даты, начиная с 2016-06-23T00:00:00.000+0200 (который должен быть отформатирован с использованием строки формата даты, которую я использовал в приведенном выше коде), и добравшись до простого 2016-06-17, удалив одну часть в то время, и она никогда не работала.

Я очистил свой проект maven, перекомпилировал его, и он не сработал.

Я думал, что Jetty не мог загрузить правильные классы, поэтому я развернул тот же код на сервере Tomcat 8, и результат был таким же.

Моя последняя попытка была написать еще одну параллельную MessageBodyReader, но вместо того, чтобы сделать его общим для Object типа, я сделал конкретный java.util.Date десериализатор, и до сих пор метод readFrom, кажется, не назовешь.

Я серьезно не знаю, что я мог бы попробовать сейчас, есть ли у вас какие-либо идеи?

Заранее спасибо.

ответ

0

Причина ошибки здесь ...

try { 
    System.out.println(json); 
    return (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX")).parse(json.getAsString()); 
} catch (ParseException e) { 
    return null; 
} 

быть более конкретным здесь:

"YYYY-MM-dd'T'HH: мм: ss.SSSXX"

java Date и SimpleParser могут содержать не более трех мест за миллисекунды, и нет шаблона.SSS XX в строке, используемой для SimpleDateFormat, так что ваш парсер бросает исключение, что вы ловля, но возвращающая Дату ссылки на нуль, Ergo:

Gson обрабатывает нулевую ссылку объекта,

+0

Это все еще не работает, я попытался удалить «XX» в конце или добавить точку останова в ловушку исключения, и ничего не происходит –

Смежные вопросы