2017-07-11 8 views
0

Wie bekomme ich MOXy, um JSON in LocalDate und LocalDateTime zu entpacken?Unmarshalling LocalDate/LocalDateTime mit MOXy

Ich habe eine @GET Methode bekommt, die mit drei Feldern der Typen LocalDate, LocalDateTime und Date jeweils eine Probe Instanz erzeugt.

diesen Endpunkt Schlagen, erhalte ich:

{ 
    "localDate": "2017-07-11", 
    "localDateTime": "2017-07-11T10:11:10.817", 
    "date": "2017-07-11T10:11:10.817+02:00" 
} 

poste ich dann die oben genannten Daten zu meiner @POST Methode, die einfach die Daten wieder zurückgibt:

{ 
    "date": "2017-07-11T10:11:10.817+02:00" 
} 

Wie Sie sehen können, sowohl localDate und localDateTime sind in dem Prozess verloren, da MOXy diese zwei Felder nicht initialisiert.

Was gibt? MOXy scheint Serialisierung dieser Typen zu unterstützen, aber keine Deserialisierung?

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import java.time.LocalDate; 
import java.time.LocalDateTime; 
import java.util.Date; 

@Path("/test/date") 
public class DateTest { 
    public static class Data { 
     public LocalDate localDate; 
     public LocalDateTime localDateTime; 
     public Date date; 
    } 

    @GET 
    @Path("roundtrip") 
    public Response roundtrip() { 
     Data sample = getSample(); 
     return roundtrip(sample); 
    } 

    @POST 
    @Path("roundtrip") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response roundtrip(Data t) { 
     return Response.status(Response.Status.OK).entity(t).build(); 
    } 

    protected Data getSample() { 
     final Data data = new Data(); 
     data.localDate = LocalDate.now(); 
     data.localDateTime = LocalDateTime.now(); 
     data.date = new Date(); 
     return data; 
    } 
} 

Moxy Version: jersey-media-moxy-2.25.1

+1

Ist es wirklich "serialisieren" (im allgemeineren Sinne) oder ruft es einfach toString() ?. Es besteht ein Unterschied. Bis MOXy/JAXB tatsächlich Java8-Zeit unterstützt, müssen Sie wahrscheinlich [einen XMLAdapter verwenden] (http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html). Oder du kannst Jackson anstelle von MOXy verwenden und [nutze seinen Java8-Zeit-Support] (https://stackoverflow.com/a/28803634/2587435) –

+0

@peeskillet Ich dachte nicht an diese Möglichkeit. Ich habe [deinen Beitrag] gelesen (https://Stackoverflow.com/a/26825079/383124) und verstanden, dass es bedeutet, dass es unterstützt wurde. – phant0m

+0

In diesem Beitrag gab ich beide Beispiele von dem, was ich als Lösungen in meinem vorherigen Kommentar erwähnte (d. H. Einen Adapter oder Schalter zu Jackson) –

Antwort

1

Nach peeskillet Vorschlag umgesetzt ich folgende Adapterklasse:

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime>{ 

    private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 

    @Override 
    public String marshal(LocalDateTime localDateTime) throws Exception { 
    return localDateTime.format(DTF); 
    } 

    @Override 
    public LocalDateTime unmarshal(String string) throws Exception { 
    return LocalDateTime.parse(string, DTF); 
    } 

} 

Darüber hinaus habe ich package-info.java im selben Paket erstellt, wo meine Klassen für moxy und die Adapter (in einem Unterpaket) befinden sich mit folgendem Inhalt:

@XmlJavaTypeAdapters({ 
    @XmlJavaTypeAdapter(type=LocalDateTime.class, 
     value=LocalDateTimeAdapter.class) 
}) 
package api; 

import java.time.LocalDateTime; 

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters; 

import api.adapter.LocalDateTimeAdapter; 

So funktioniert das Marshalling und das Unmarshalling ohne Probleme. Und mit DTF können Sie das Format angeben, das angewendet werden soll.