Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MOXy解组LocalDate/LocalDateTime_Java_Jaxb_Jersey_Jax Rs_Moxy - Fatal编程技术网

Java 使用MOXy解组LocalDate/LocalDateTime

Java 使用MOXy解组LocalDate/LocalDateTime,java,jaxb,jersey,jax-rs,moxy,Java,Jaxb,Jersey,Jax Rs,Moxy,如何让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" } 然后,我将上述数据发

如何让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;
导入javax.ws.rs.GET;
导入javax.ws.rs.POST;
导入javax.ws.rs.Path;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.core.Response;
导入java.time.LocalDate;
导入java.time.LocalDateTime;
导入java.util.Date;
@路径(“/test/date”)
公共类日期测试{
公共静态类数据{
公共LocalDate LocalDate;
公共LocalDateTime LocalDateTime;
公开日期;
}
@得到
@路径(“往返”)
公众回应往返{
数据样本=getSample();
往返(样本);
}
@职位
@路径(“往返”)
@使用(MediaType.APPLICATION_JSON)
公众响应往返(数据t){
返回Response.status(Response.status.OK).entity(t.build();
}
受保护的数据getSample(){
最终数据=新数据();
data.localDate=localDate.now();
data.localDateTime=localDateTime.now();
data.date=新日期();
返回数据;
}
}

Moxy版本:
jersey-media-Moxy-2.25.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);
  }

}

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

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

}

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

它是真正的“序列化”(在更普通的意义上)还是只是调用toString()?。这是不同的。在MOXy/JAXB真正支持Java8之前,您可能需要这样做。或者你可以用Jackson代替MOXy,还有@peeskillet,我没有想到这种可能性。我阅读并理解这意味着它得到了支持。在那篇文章中,我实际上给出了我在之前的评论中提到的解决方案的两个例子(即使用适配器或切换到Jackson)。事实上,我认为我需要更新这篇文章。我可能只使用序列化进行了测试:-D@peeskilletXMLAdapter确实解决了这个问题。此外,您还可以指定LocalDateTime的封送/反封送格式+1它真的是“序列化”(在更普通的意义上)还是只是调用toString()?。这是不同的。在MOXy/JAXB真正支持Java8之前,您可能需要这样做。或者你可以用Jackson代替MOXy,还有@peeskillet,我没有想到这种可能性。我阅读并理解这意味着它得到了支持。在那篇文章中,我实际上给出了我在之前的评论中提到的解决方案的两个例子(即使用适配器或切换到Jackson)。事实上,我认为我需要更新这篇文章。我可能只使用序列化进行了测试:-D@peeskilletXMLAdapter确实解决了这个问题。此外,您还可以指定LocalDateTime的封送/反封送格式+1.