2017-07-11 39 views
0

如何获得MOXy将解组JSON解码为LocalDateLocalDateTime使用MOXy解组LocalDate/LocalDateTime

我有一个@GET方法,它会分别产生一个样本实例,其中的三个字段的类型分别为LocalDate,LocalDateTimeDate

击中该端点,我得到:

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

我那么上面的数据后到我@POST方法,它只需再次返回数据:

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

正如你所看到的,localDatelocalDateTime都会丢失,因为MOXy不会初始化这两个字段。

什么给? MOXy似乎支持这些类型的序列化,但不是反序列化?

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; 
    } 
} 

莫西版本:jersey-media-moxy-2.25.1

+1

它真的是“序列化”(在更常见的意义上)还是只是调用toString()?.有一个区别。在MOXy/JAXB实际上支持Java8时间之前,您可能需要[使用XMLAdapter](http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html )。或者你可以使用Jackson而不是MOXy,并且[使用它的Java8时间支持](https://stackoverflow.com/a/28803634/2587435) –

+0

@peeskillet我没有想到这种可能性。我读[你的文章](https://stackoverflow.com/a/26825079/383124),并理解这意味着它被支持。 – phant0m

+0

在那篇文章中,我实际上给出了我在之前的评论中提到的作为解决方案的两个示例(即使用适配器或切换到杰克逊) –

回答

1

根据peeskillet的建议我采取了以下适配器类:

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); 
    } 

} 

另外,我在同一个包创建package-info.java在我的班莫西和适配器(在一个分包中)位于以下内容中:

@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; 

因此,编组和解组工作没有问题。用DTF您可以指定应该应用的格式。