使用JAX-RS和java.time.LocalDate(java8)时出现问题。
java.time.LocalDate
我想使用JSON将这样的对象传递到JAX-RS方法中:
Person { java.time.LocalDate birthDay; }
我得到的异常是:
com.fasterxml.jackson.databind.JsonMappingException:没有合适的构造找到型[简单的类型,类java.time.LocalDate在[来源不能实例从JSON对象(需要添加/启用类型信息)::] io.undertow.servlet.spec.ServletInputStreamImpl@21cca2c1; 行:2,列:3]
com.fasterxml.jackson.databind.JsonMappingException
io.undertow.servlet.spec.ServletInputStreamImpl@21cca2c1
如何创建某种将json-dates映射到的拦截器java.time.LocalDate?我尝试实现a MessageBodyReader,但是如果LocalDateis是另一个类中的 字段 ,则我必须MessageBodyReader为每个持有a的类编写一个LocalDate(据我所知)。
MessageBodyReader
LocalDate
(Java EE7(仅使用javaee-api,并且不希望任何第三方依赖性),JAX-RS,Java 8,Wildfly 8.2)
有什么建议?
通常,我会说要为Jackson编写一个序列化器/反序列化器,但是由于您不需要任何其他依赖关系,因此可以使用JAXB解决方案。Jackson(与Resteasy一起)支持JAXB批注。所以我们可以做的就是编写一个XmlAdapter从String转换为的LocalDate。一个例子是像
XmlAdapter
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)。
DateTimeFormatter.ISO_DATE
然后,您所需要做的就是为该类型的getter注释字段
public class Person { private LocalDate birthDate; @XmlJavaTypeAdapter(LocalDateAdapter.class) public LocalDate getBirthDate() { return birthDate; } public void setBirthDate(LocalDate birthDate) { this.birthDate = birthDate; } }
如果您不希望使用此注释使模型类混乱,则可以在包级别声明该注释。
在package-info.java与模型类相同的包中的文件中,添加此内容
package-info.java
@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;
@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
2015-01-04
同样对于Jackson(我知道OP所说的没有依赖性,但这是针对其他人的),您可以使用jackson-datatype- jsr310模块。 在这里 查看完整的解决方案 ****