jor*_*gen 12 java json jax-rs jackson java-8
使用JAX-RS和java.time.LocalDate
(java8)的问题.
我想使用JSON将这样的对象传递给JAX-RS方法:
Person {
java.time.LocalDate birthDay;
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:
com.fasterxml.jackson.databind.JsonMappingException
:找不到类型[simple type,classjava.time.LocalDate
]的合适构造函数:无法在[来源:io.undertow.servlet.spec.ServletInputStreamImpl@21cca2c1
; 来自JSON对象(需要添加/启用类型信息?)实例化)line:2,column:3]
我怎样才能创建一种将json-dates映射到的拦截器java.time.LocalDate
?我试过实现了一个MessageBodyReader
,但如果LocalDate
是另一个类中的一个字段,我必须MessageBodyReader
为每个持有a的类写一个LocalDate
(据我所知).
(Java EE7(仅使用javaee-api,不需要任何第三方依赖),JAX-RS,Java 8,Wildfly 8.2)
有什么建议?
Pau*_*tha 24
通常我会说要为Jackson编写一个Serializer/Deserializer,但由于你不需要任何其他依赖,你可以使用JAXB解决方案.Jackson(带有Resteasy)支持JAXB注释.所以我们能做的就是编写一个XmlAdapter
从String转换为LocalDate
.一个例子就是这样的
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);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以选择你想要的任何格式,我只是使用了DateTimeFormatter.ISO_DATE
,这基本上会寻找这种格式(2011-12-03).
然后,您需要做的就是为该类型的getter注释该字段
public class Person {
private LocalDate birthDate;
@XmlJavaTypeAdapter(LocalDateAdapter.class)
public LocalDate getBirthDate() { return birthDate; }
public void setBirthDate(LocalDate birthDate) {
this.birthDate = birthDate;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不想使用此批注来混淆模型类,则可以在包级别简单地声明批注.
在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;
Run Code Online (Sandbox Code Playgroud)
@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();
}
Run Code Online (Sandbox Code Playgroud)
结果: 2015-01-04
同样对于Jackson(我知道OP表示没有依赖关系,但这适用于其他人),您可以使用jackson-datatype-jsr310模块.在此查看完整解决方案
归档时间: |
|
查看次数: |
19272 次 |
最近记录: |