在Java中将Date序列化和反序列化为Bean

时间:2017-12-06 22:12:06

标签: json java-ee jax-rs deserialization

我要参与项目:名为Usuario的API Rest和名为store的JEE Application。 Store通过Usuario API获取信息。

使用MediaType.APPLICATION_JSON_TYPE发送和接收所有信息。

在API中有Evento实体,它具有下一个属性:Date fecha。 在JEE应用程序中有Evento bean,它具有下一个属性:Date fecha。

当API发送Evento类的任何对象时,它会发送日期格式为yyyy-MM-dd HH:mm:{“Date”:“2017-12-06 23:02”}。

JEE应用程序使用Client和WebTarget来使用de API并获取信息。

这里的问题是evento对象中的fecha(类型为Date)为null。它没有很好地反序列化。

我不能在JEE Application上使用Spring。我在商店应用程序中使用JAX-RS。

请问你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

首先澄清一些事实。 (不过,我不是100%肯定的。)

  • 在JSON中没有表示日期或时刻的标准规则。
    • 有些人使用millisecons,而其他人使用了一些格式化字符串,例如ISOZ。
  • 在Java EE中没有用于序列化/反序列化的标准规则。
    • 它仅作为application/json的基础消息提供程序。
    • 请注意,JSON-B可能尚未在规范中提供。

我们说我们有这个实体。

// I really want to know what Evento/fatcha means.
// Are they Italian words?
@XmlRootElement
@Entity
public class Evento implements Serializable {

    public Date getFetcha() {
        return ofNullable(fetcha)
                .map(v -> new Date(v.getTime()))
                .orElse(null);
    }

    public void setFetcha(final Date fetcha) {
        this.fetcha = ofNullable(fetcha)
                .map(v -> new Date(v.getTime()))
                .orElse(null);
    }

    @XmlElement
    @Temporal(TIMESTAMP)
    private Date fetcha;
}

现在我们无法提供帮助,但依赖于基础MessageReaderMessageWriterapplication/json中序列化/反序列化。

杰克逊将以某种方式工作,而MOXy将以其方式运作。

推送客户端的唯一方法是,当他们GET资源时,他们应该使用与格式完全相同的格式。

我使用的一种方法是使用另一个属性进行统一格式化/解析。

@XmlRootElement
@Entity
public class Evento implements Serializable {

    // ...

    @JsonProperty
    @JsonbProperty
    @XmlElement
    public String getFetchaIsoz() {
        return ofNullable(getFetcha())
                .map(Date::toInstant)
                .map(DateTimeFormatter.ISO_INSTANT:format)
                .orElse(null);
    }

    public void setFetchaIsoz(final String fetchaIsoz) {
        setFetcha(ofNullable(fetchaIsoz)
                .map(DateTimeFormatter.ISO_INSTANT:parse)
                .map(Instant::from)
                .map(Date::from)
                orElse(null));
    }

    @JsonIgnore // just in case, e.g. Spring?
    @JsonbTransient
    @XmlTransient
    @Temporal(TIMESTAMP)
    private Date fetcha;
}

我们没有替代属性可以保证以特定格式工作。