如何让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
答案 0 :(得分:2)
根据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
,其中我的MOXy类和适配器(在子包中)的位置包含以下内容:
@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
,您可以指定应该应用的格式。