【问题标题】:Unmarshalling LocalDate/LocalDateTime with MOXy使用 MOXy 解组 LocalDate/LocalDateTime
【发布时间】:2019-04-23 13:03:54
【问题描述】:

如何让 MOXy 将 JSON 解组为 LocalDateLocalDateTime

我有一个@GET 方法,该方法生成一个示例实例,其中包含三个字段类型分别为LocalDateLocalDateTimeDate

到达那个端点,我得到:

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

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


【解决方案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);
  }

}

此外,我在我的 MOXy 类和适配器(在子包中)所在的同一个包中创建了 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,您可以指定要应用的格式。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2015-05-30
    • 2022-01-06
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多