java - 如何让 JAX-RS 返回 Java 8 LocalDateTime 属性作为 JavaScript 样式的日期字符串?

标签 java json jax-rs java-8 java-time

我使用 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 XMLAdapter

  • Jackson 你需要 configure its Java8 time support . Jersey 和 RESTEasy 都是这种情况。

关于java - 如何让 JAX-RS 返回 Java 8 LocalDateTime 属性作为 JavaScript 样式的日期字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26804941/

相关文章:

java - 将 GWT 项目部署到 Web 领域

javascript - 访问 JSON 子项时出现问题

java - Jersey 2 - 从资源方法返回客户端的响应

dependency-injection - 使用内置 Jersey 依赖注入(inject)在 Je​​rsey 2 中创建简单的单例类时遇到问题

java - Jackson 从 json 字符串转换为 Java 对象会产生默认对象

web-services - 使用 JAX-RS Jersey 2.2 获取带有 Content-Type 和 Accept header 的请求

java - 以固定速率安排 Callable

java - 链表或递归调用 HashMap

java - 无法找到配套共享库

javascript - Youtube 使用 "default"作为对象属性的名称