首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAX-RS和java.time.LocalDate作为输入参数

JAX-RS和java.time.LocalDate作为输入参数
EN

Stack Overflow用户
提问于 2015-01-04 18:27:54
回答 1查看 26.6K关注 0票数 16

使用JAX和java.time.LocalDate (java8)的问题。

我希望使用JSON将这样的对象传递给JAX方法:

代码语言:javascript
复制
Person {
  java.time.LocalDate birthDay;
}

我得到的例外是:

com.fasterxml.jackson.databind.JsonMappingException:没有为类型简单类型找到合适的构造函数,类java.time.LocalDate:无法从JSON对象实例化(需要添加/启用类型信息吗?)资料来源:io.undertow.servlet.spec.ServletInputStreamImpl@21cca2c1;行: 2,列:3

如何创建将json日期映射到java.time.LocalDate的拦截器?我尝试过实现MessageBodyReader,但是如果LocalDate是另一个类中的字段,我必须为每个包含LocalDate的类编写一个MessageBodyReader (据我所了解)。

( EE7 (仅使用javaee,不需要任何第三方依赖项)、JAX、Java8、Wildfli8.2)

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-05 01:24:08

通常,我会说为Jackson编写序列化程序/反序列化器,但是由于不需要任何其他依赖项,所以可以使用JAXB解决方案。Jackson (带有Resteasy)支持JAXB注释。因此,我们所能做的就是编写一个XmlAdapter,将其从字符串转换为LocalDate。举个例子

代码语言:javascript
复制
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {

    @Override
    public LocalDate unmarshal(String dateString) throws Exception {
        return LocalDate.parse(dateString, DateTimeFormatter.ISO_DATE);
    }

    @Override
    public String marshal(LocalDate localDate) throws Exception {
        return DateTimeFormatter.ISO_DATE.format(localDate);
    }
}

你可以选择你想要的任何格式,我只是使用了DateTimeFormatter.ISO_DATE,它基本上会查找这种格式(2011-12-03)。

然后,您所需要做的就是为类型的getter注释字段。

代码语言:javascript
复制
public class Person {
    private LocalDate birthDate;

    @XmlJavaTypeAdapter(LocalDateAdapter.class)
    public LocalDate getBirthDate() { return birthDate; }

    public void setBirthDate(LocalDate birthDate) { 
        this.birthDate = birthDate;
    }
}

如果您不想让您的模型类与此注释混在一起,那么只需在包级别声明注释即可。

在与模型类(Es)相同的包中的package-info.java文件中,添加以下内容

代码语言:javascript
复制
@XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(type = LocalDate.class, 
                        value = LocalDateAdapter.class)
})
package thepackage.of.the.models;

import java.time.LocalDate;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;

测试

代码语言:javascript
复制
@Path("/date")
public class DateResource {
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response postPerson(Person person) {
        return Response.ok(DateTimeFormatter.ISO_DATE.format(
                           person.getBirthDate())).build();
    }
}

@Test
public void testResteasy() throws Exception {
    WebTarget target = client.target(
            TestPortProvider.generateURL(BASE_URI)).path("date");
    String person = "{\"birthDate\":\"2015-01-04\"}";
    Response response = target.request().post(Entity.json(person));
    System.out.println(response.readEntity(String.class));
    response.close();
}

结果:2015-01-04

更新

同样对于Jackson (我知道OP said没有依赖项,但这是针对其他人的),您可以使用杰克逊-数据类型-jsr310 310模块。见完整解决方案这里

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27768866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档