【发布时间】:2019-04-23 13:03:54
【问题描述】:
如何让 MOXy 将 JSON 解组为 LocalDate 和 LocalDateTime?
我有一个@GET 方法,该方法生成一个示例实例,其中包含三个字段类型分别为LocalDate、LocalDateTime 和Date。
到达那个端点,我得到:
{
"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"
}
如您所见,localDate 和 localDateTime 在此过程中都丢失了,因为 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;
}
}
Moxy 版本:jersey-media-moxy-2.25.1
【问题讨论】:
-
它真的是“序列化”(在更常见的意义上)还是只是调用 toString()?有区别。在 MOXy/JAXB 真正支持 Java8 之前,您可能需要use an XMLAdapter。或者你可以用 Jackson 代替 MOXy,use its Java8 time support
-
@peeskillet 我没有想到这种可能性。我阅读了your post 并理解这意味着它受到支持。
-
在那篇文章中,我实际上给出了我在之前评论中提到的解决方案的两个示例(即使用适配器或切换到 Jackson)
-
其实我觉得我需要更新帖子了。我可能只使用序列化进行了测试:-D
-
@peeskillet XMLAdapter 确实解决了这个问题。此外,您还可以指定 LocalDateTime 将如何编组/解组的格式。 +1
标签: java jaxb jersey jax-rs moxy