我使用 JAX-RS 方法注释创建了一个 RESTful 网络服务:
@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public MyThing test()
{
MyThing myObject = new MyThing(LocalDateTime.now());
return myObject;
}
这很好用,但我想调整一件事:如果返回的 Java 对象包含新的 Java 8 LocalDateTime 类型的属性,则它表示为 JSON 对象:
{"myDateTimeProperty":{"hour":14,"minute":32,"second":39,"year":2014,"month":"NOVEMBER","dayOfMonth":6,"dayOfWeek":"THURSDAY","dayOfYear":310,"monthValue":11,"nano":0,"chronology":{"calendarType":"iso8601","id":"ISO"}},...}
我如何告诉 JAX-RS 返回一个 JavaScript Date.toJSON() 风格的字符串
{"myDateTimeProperty":"2014-11-07T15:06:36.545Z",...}
代替?
最佳答案
注意:请参阅下面的更新
我以前从未使用过 LocalDateTime
,所以我决定做一些测试。以下是我的发现:
Jersy 2.13 和此提供程序(开箱即用,无需额外配置)
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-moxy</artifactId> <version>${jersey.version}</version> </dependency>
带有此提供程序的 Jersey 2.13(支持 JAXB 注释 - 依赖于 jackson-module-jaxb-annotations),带有自定义适配器
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>${jersey.version}</version> </dependency> public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> { @Override public LocalDateTime unmarshal(String s) throws Exception { return LocalDateTime.parse(s); } @Override public String marshal(LocalDateTime dateTime) throws Exception { return dateTime.toString(); } } // Getter for model class @XmlJavaTypeAdapter(LocalDateTimeAdapter.class) public LocalDateTime getDateTime() { return dateTime; }
带有此提供程序的 Resteasy 3.0.9(还支持 JAXB 注释 - 依赖于 jackson-module-jaxb-annotations),带有自定义适配器(见上文)
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson2-provider</artifactId> <version>${resteasy.version}</version> </dependency>
Resteasy 和 Jersey 都具有这种依赖性(如果没有自定义配置也无法工作,与最后两个相同 - 使用适配器)
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.4.0</version> </dependency>
我们需要确保注册
JacksonJaxbJsonProvider
所以我想似乎任何使用 Jackson 的提供者都不会在没有一些自定义配置的情况下为您提供所需的结果,无论是通过适配器(如上所示)还是通过其他一些自定义配置。 jersey-media-moxy
提供程序不使用 Jackson。
更新
在大多数情况下,以上信息是不正确的。
MOXy 默认情况下不工作。它通过简单地调用
toString()
来进行序列化,这可能是也可能不是您想要的,并且在 de 序列化时不起作用。如果你使用的是 MOXy,在它支持 Java8 之前,你将需要 use an XMLAdapterJackson 你需要 configure its Java8 time support . Jersey 和 RESTEasy 都是这种情况。
关于java - 如何让 JAX-RS 返回 Java 8 LocalDateTime 属性作为 JavaScript 样式的日期字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26804941/