Я безуспешно пытаюсь заставить Play сериализовать и десериализовать java 8 LocalDate.
Говорят, что в Play 2.4 это работает из коробки:
Для Play 2.4 теперь требуется JDK 8. Благодаря этому Play может «из коробки» обеспечивать поддержку типов данных Java 8. Например, JSON API от Play теперь поддерживают временные типы Java 8, включая Instance, LocalDateTime и LocalDate.
Но я не могу заставить его работать.
Вот что у меня есть: я использую Play 2.4.3 с плагинами PlayJava и PlayEbean.
Модель
@Entity
public class Person extends Model {
@Id
public Long id;
public String name;
public LocalDate dayOfBirth;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
public LocalDate anotherDate;
@Formats.DateTime(pattern = "dd/MM/yyyy")
public LocalDate andAnotherOne;
public static Model.Finder<Long, Person> find = new Model.Finder<Long, Person>(Person.class);
}
Контроллер
public class PersonController extends Controller {
public Result create() {
Person person = Json.fromJson(request().body().asJson(), Person.class);
person.save();
return ok(Json.toJson(person));
}
public Result all() {
return ok(Json.toJson(Person.find.all()));
}
}
маршруты
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"}
Ошибка
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"])
Что мне не хватает?
обновление: пример приложения: https://github.com/fredferrao/LocalDateJSONTest