避免使用TomEE和Jersey序列化LocalDateTime

时间:2019-07-17 08:44:42

标签: java json rest jpa serialization

我对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中进行了序列化。 是否可以通过上述简单格式获得输出?

感谢您的帮助!

2 个答案:

答案 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;
...