Playframework 如何在Play框架JSON Rest上使用java.time.LocalDate?

Playframework 如何在Play框架JSON Rest上使用java.time.LocalDate?,playframework,playframework-2.4,Playframework,Playframework 2.4,我试图让Play序列化并反序列化Java8LocalDate,但没有成功 在剧本2.4中,据说是开箱即用: Play 2.4现在需要JDK 8。因此,Play可以开箱即用地提供对Java8数据类型的支持。例如,Play的JSON API现在支持Java8时态类型,包括Instance、LocalDateTime和LocalDate 但是我不能让它工作 以下是我所拥有的: 我正在使用Play2.4.3,以及PlayJava和PlayEbean插件 模型 路线 POST /person

我试图让Play序列化并反序列化Java8LocalDate,但没有成功

在剧本2.4中,据说是开箱即用:

Play 2.4现在需要JDK 8。因此,Play可以开箱即用地提供对Java8数据类型的支持。例如,Play的JSON API现在支持Java8时态类型,包括Instance、LocalDateTime和LocalDate

但是我不能让它工作

以下是我所拥有的: 我正在使用Play2.4.3,以及PlayJava和PlayEbean插件

模型

路线

POST        /person              @controllers.PersonController.create()

GET         /person              @controllers.PersonController.all()
我用chrome的REST应用程序对其进行了测试,得到了以下三种形式的错误:

{"name":"Fred","dayOfBirth":"2015-09-30"}
{"name":"Fred","anotherDate":"30/09/2015"}  
{"name":"Fred","andAnotherOne":"30/09/2015"}
错误

我错过了什么


更新:示例应用程序:

我发现了问题,Play正在注入一个自定义ObjectMapper,我认为它没有注册jackson的JDK8模块和JSR310模块

我打开了一个

我发现的解决方法是在Global.java上设置自己的ObjectMapper

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import play.Application;
import play.GlobalSettings;
import play.libs.Json;

/**
 * Criado por ferrao em 01/10/2015.
 */
public class Global extends GlobalSettings {
    public void onStart(Application app) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        mapper.registerModule(new JSR310Module());
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        Json.setObjectMapper(mapper);
    }
}

我从play.libs.Json源代码复制的mapper.configure部分

我想我也有同样的问题。我也在使用Play2.4,我的项目几乎是从零开始的。默认情况下,他们似乎不再拥有/使用全局对象。这至少是令人沮丧的。知道我如何在没有它的情况下设置ObjectMapper吗?或者我现在是否需要包含一个GlobalSettings对象来绕过这个bug?事实上,我错了。这是一个不同的错误:由以下原因引起:java.lang.IllegalStateException:error(s)binding form:{“dateOfBirth”:[“Invalid value”]}在play.data.form.get(form.java:592)~[play-java_2.11-2.4.4.jar:2.4.4]实际上,除了我自己的问题之外,我最终不得不用你的方式解决json问题。非常感谢。如何修复序列化问题,即转换为JSON时,LocalDate的格式为数组[2016,8,11],我希望它是ISO 8061格式,如2016-08-11。@Jaanus只需将
@JsonFormat(shape=STRING)
注释添加到
LocalDate
字段中即可。
{"name":"Fred","dayOfBirth":"2015-09-30"}
{"name":"Fred","anotherDate":"30/09/2015"}  
{"name":"Fred","andAnotherOne":"30/09/2015"}
java.lang.RuntimeException:     com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate     value of type [simple type, class java.time.LocalDate] from String value     ('2015-09-30'); no single-String constructor/factory method
 at [Source: N/A; line: -1, column: -1] (through reference chain:     models.Person["dayOfBirth"])
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import play.Application;
import play.GlobalSettings;
import play.libs.Json;

/**
 * Criado por ferrao em 01/10/2015.
 */
public class Global extends GlobalSettings {
    public void onStart(Application app) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        mapper.registerModule(new JSR310Module());
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        Json.setObjectMapper(mapper);
    }
}