2015-07-07 3 views
1

Quick Интро (может быть пропущены): Привет, есть много вопросов и ответов по этой теме, но иногда решение настолько просто, что вы просто не даже думать, и потому, что я потерял много времени, я хочу опубликовать дополнение ко всем ответам.Анализировать JSON Дата от POST с Genson и Джерси

Проблема: У вас есть служба JSON REST, который обрабатывает POST запросы, чтобы сохранить объект JSON, но этот объект содержит поле даты, не разобранные вне коробки по Genson.

Java-объекта:

public class MyObj { 

    // The field you want to serialize/deserialize 
    private Date date; 

    // Constructor with no arguments needed by Genson 
    public MyObj() {} 
} 

остальной сервис с Джерси:

@Path("/api/my-obj") 
public class MyObjAPI { 

    @POST 
    @Consumes("application/json") 
    public Response insert(MyObj myObj) { 
     // do what you want with myObj, it's ready to use with the date 
     return Response.created('url/to/created/object').build(); 
    } 
} 

Клиент в JavaScript с JQuery:

// This is the JSON Object to POST 
var myObj = { 
    date: new Date() 
}; 

$.ajax({ 
    method: 'POST', 
    url: '/api/my-obj', 
    data: JSON.stringify(myObj), 
    dataType: 'json', 
    processData: false, 
    contentType: 'application/json' 
}); 
+1

BTW, Genson работает с конструкторами, которые тоже принимают аргументы. Просто включите его через GensonBuilder.useConstructorWithArguments (true) – eugen

ответ

3

РЕШЕНИЕ:

Genson обеспечивает простой способ определить, как даты (де) сериализации, это решение можно найти везде:

@Provider 
public class GensonProvider implements ContextResolver<Genson> { 

    private final Genson genson = new GensonBuilder() 
      .useDateAsTimestamp(false) 
      .useDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")) 
      .create(); 

    @Override 
    public Genson getContext(Class<?> type) { 
     return genson; 
    } 
} 

ВАЖНО:

Если вышеприведенное решение не работает, убедитесь, что тип даты поля в вашем Java-объекте является импортированным с помощью:

import java.util.Date; 

и нет:

import java.sql.Date; 

я понял это сам, но не нашел его где-нибудь на StackOverflow, это глупая ошибка настолько просто, что вы не могли бы думать о том (как я), я надеюсь, что это Я помогу кому-нибудь.