我对JPA实体类的LocalDateTime的序列化有问题。 我有一个“挑战”类,其中包含两个日期“ begindate”和“ enddate”。
...
@Column(name = "begindate")
private LocalDateTime begindate;
@Column(name = "enddate")
private LocalDateTime enddate;
...
我已经指定了LocalDateTimeAttributeConverter,JPA可以将LocalDateTime转换为时间戳。
我使用Jersey编写了一个Web应用程序,该应用程序从数据库请求我的挑战实体。
当我测试对实体的GET
请求时,我希望显示的日期类似于"begindate": "2019-09-01T00:00:00+02:00"
,但是我的应用程序以以下格式提供属性:
"begindate": {
"date": {
"dayOfWeek": "MONDAY",
"month": "JULY",
"year": 2019,
"dayOfMonth": 1,
"dayOfYear": 182,
"era": "CE",
"monthValue": 7,
"chronology": {
"calendarType": "iso8601",
"id": "ISO"
},
"leapYear": false,
"day": 1
},
"dayOfWeek": "MONDAY",
"hour": 12,
"month": "JULY",
"dayOfMonth": 1,
"dayOfYear": 182,
"year": 2019,
"monthValue": 7,
"nano": 0,
"time": {
"hour": 12,
"nano": 0,
"minute": 0,
"second": 0
},
"minute": 0,
"second": 0
}
当我使用GlassFish Server时,输出与我预期的一样。 现在我正在使用TomEE 7,因为我在GlassFish Server上遇到了一些麻烦,并且LocalDateTime在JSON中进行了序列化。 是否可以通过上述简单格式获得输出?
感谢您的帮助!
答案 0 :(得分:0)
Tomee 7使用johnzon映射器进行json序列化,因此您可以编写java.time类型的Converter并通过johnzon API http://tomee.apache.org/tomee-8.0/docs/developer/json/index.html对其进行映射。您还可以设置提供程序的自定义展示,只需通过子类将自定义的Mapper实例传递给JohnzonProvider即可,以避免模型上的注释,如果不希望修改您的实体,则使其成为全局注释。只是不要忘记使用提供的范围设置johnzon-jaxrs依赖项。
答案 1 :(得分:-1)
在您的情况下,我会将Adapter添加到实体中的DateTime字段。像这样:
创建类LocalDateTimeAdapter.java
import java.time.LocalDateTime;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {
private final LocalDateTimeConverter converter = new LocalDateTimeConverter();
@Override
public LocalDateTime unmarshal(String dateTimeString) throws Exception {
return converter.fromString(dateTimeString);
}
@Override
public String marshal(LocalDateTime localDateTime) throws Exception {
return converter.toString(localDateTime);
}
}
然后在您的实体类中使用它:
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
...
...
@Column(name = "begindate")
@XmlJavaTypeAdapter(value = LocalDateTimeAdapter.class)
private LocalDateTime begindate;
@Column(name = "enddate")
@XmlJavaTypeAdapter(value = LocalDateTimeAdapter.class)
private LocalDateTime enddate;
...