【发布时间】:2016-03-31 00:41:02
【问题描述】:
我无法为新的 java.time.* 类型进行任何类型的转换或兼容性。或者至少,LocalDate。
我看到了异常:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[IllegalStateException: Error(s) binding form: {"dateOfBirth":["Invalid value"]}]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:265) ~[play_2.11-2.4.4.jar:2.4.4]
Caused by: java.lang.IllegalStateException: Error(s) binding form: {"dateOfBirth":["Invalid value"]}
at play.data.Form.get(Form.java:592) ~[play-java_2.11-2.4.4.jar:2.4.4]
at controllers.Application.addPatient(Application.java:49) ~[classes/:na]
我发现了几种方法,原则上应该可以使用 JPA hibernate,但是,如果这(再次)是 Play 的问题还是什么?我不知道。
第一种方法:
提供您自己的自定义转换器:
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date>
{
@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
return (locDate == null ? null : Date.valueOf(locDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
然后在球场上需要使用这个:
@Convert(converter = LocalDateAttributeConverter.class)
public LocalDate dateOfBirth;
http://www.thoughts-on-java.org/persist-localdate-localdatetime-jpa/
当然,据我了解,原则上我不需要@Convert 注释,因为转换器本身已使用@Converter(autoApply = true) 注释进行注释。但是,由于我找不到有关在 Play 中成功使用 Converters 的文档(也没有在 google 上获得任何点击),因此我尝试过使用和不使用,但没有任何成功。
下一个方法:
嗯,实际上,据我所知,自 hibernate 5 以来,现在应该支持较新的 java8 类型......而且我已经使用了 5.0.5,并在我的类路径中包含了必要的库:
"org.hibernate" % "hibernate-java8" % "5.0.5.Final",
https://hibernate.atlassian.net/browse/HHH-8844
这根本没有帮助。相同的堆栈跟踪。
为了更好的衡量,我添加了休眠特定的注释
@Type(type="java.time.LocalDate")
到我的领域。
那会很丑。但我会忍受它,如果它有帮助的话。它没有。同样的例外。将其与转换器一起使用会导致其他错误。这很有趣。
我正在使用 Play 2.4 和 Hibernate 5.0.5。 有没有人设法做到这一点?
【问题讨论】:
-
我想在平安夜发布这个是个坏主意。
标签: java hibernate jpa playframework java-8