java - 使用 MOXy 解码 LocalDate/LocalDateTime

标签 java jaxb jersey jax-rs moxy

如何让 MOXy 将 JSON 解码为 LocalDateLocalDateTime

我有一个@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;
    }
}

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

}

此外,我在 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,您可以指定应应用的格式。

关于java - 使用 MOXy 解码 LocalDate/LocalDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029200/

相关文章:

java - 使用 REST 服务发送具有任意键值的 JSON (Jersey/Jackson)

java - 如何设置 libpd 以在 Java 中使用?

java - 无法在 JTable 的单个单元格中添加两个按钮

java - java中如何让bazel通过maven_jar递归下载依赖

需要 Java/Jaxb 帮助才能不覆盖现有文件

java - 在 JEE Restful Web 服务和 Android 之间使用相同的 API 解析数据的最佳方法是什么?

java - 如何使用 Java 在 Eclipse 中使用 Web 服务(JAX - RS)从数据库中检索数据

java - 从 PlayFramework 切换到 SpringMVC

java - 配置多态对象集合以在 JAXB2 中工作

java - 对 servlet 的一个请求可以有两种类型的响应