2012-12-10 13 views
15

Ho un'applicazione JAX-RS che utilizza JBoss AS 7.1 e I POST/GET oggetti JSON e XML che includono Date (java.util.Date):Serializzare la data in un servizio Web JSON REST come stringa ISO-8601

Quando uso @Produce ("application/xml") sul metodo get, gli oggetti vengono serializzati come XML e le date vengono convertite in stringhe ISO-8601 (ad esempio "2012-12-10T14: 50: 12.123 +02: 00").

Tuttavia, se uso @Produce ("application/json") sul metodo get, le date negli oggetti JSON sono timestamp (ad esempio "1355147452530") anziché le stringhe ISO-8601.

Come è possibile configurare l'implementazione JAX-RS (RESTEasy) per serializzare le date in formato JSON come stringhe ISO-8601 anziché timestamp?

Grazie per le vostre risposte.

Nota: Ho anche provato ad utilizzare un provider personalizzato JAX-RS per fare la serializzazione JSON per le date

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class CustomJsonDateProvider implements MessageBodyWriter<Date> 
{ 
    ... 
} 

Questo provider sembra essere registrato da RESTEasy su JBoss all'avvio:

[org.jboss.jaxrs] Adding JAX-RS provider classes: package.CustomJsonDateProvider 
... 
[org.jboss.resteasy.cdi.CdiInjectorFactory] No CDI beans found for class package.CustomJsonDateProvider. Using default ConstructorInjector. 

ma non è mai usato!

risposta

8

presumo il parser JSON è Jackson, provare:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET") 
public Date date; 

(dal Jackson 2.0)

2

L'impostazione predefinita di JBoss parser è Jettison, ma non ero in grado di cambiare il formato della data. Quindi sono passato a Jackson e ha aggiunto la seguente classe al mio progetto per configurarlo:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JacksonConfig implements ContextResolver<ObjectMapper> 
{ 
    private final ObjectMapper objectMapper; 

    public JacksonConfig() 
    { 
     objectMapper = new ObjectMapper(); 
     objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESPAMPS, false); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> objectType) 
    { 
     return objectMapper; 
    } 
} 
+0

mio JBoss EAP 7 JAX-RS implentation è RESTEasy e l'ho fatto' Voglio aggiungere una dipendenza Jackson. Dopo un giorno di ricerche, ho trovato la soluzione ('JacksonConfig'). Ho aggiunto Maven dipendenza ' com.fasterxml.jackson.core jackson-databind 2.8.7' e usato un formato di data personalizzato 'objectMapper.setDateFormat (nuova SimpleDateFormat (" dd.MM.yyyy "))" invece del predefinito impostato con 'objectMapper.configure()' –

1

persone dispiace per gridare ad alta voce - ho trovato le risposte qui

http://wiki.fasterxml.com/JacksonFAQDateHandling,

qui

http://wiki.fasterxml.com/JacksonFAQ#Serializing_Dates,

qui

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

qui

http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/map/util/StdDateFormat.html

Utilizzando la @JsonSerialize (utilizzando = ...) così:

public class JsonStdDateSerializer 
extends JsonSerializer<Date> { 

    private static final DateFormat iso8601Format = 
    StdDateFormat.getBlueprintISO8601Format(); 

    @Override 
    public void serialize(
    Date date, JsonGenerator jgen, SerializerProvider provider) 
    throws IOException, JsonProcessingException { 

    // clone because DateFormat is not thread-safe 
    DateFormat myformat = (DateFormat) iso8601Format.clone(); 
    String formattedDate = myformat.format(date); 
    jgen.writeString(formattedDate); 
    } 
}