首页 > 解决方案 > JAX-RS 解析日期作为响应

问题描述

我有两个应用程序。第一个应用程序(Spring Boot)向第二个应用程序(JavaEE 7)发送一些信息。在 Java EE 应用程序中,我使用 JAX-RS 客户端,当我尝试从第一个应用程序获取响应时出现异常。

Caused by: javax.json.bind.JsonbException: Unable to deserialize property 'openDate' because of: Error parsing class java.util.Date from value: 2016-07-14T21:00:00.000+0000. Check your @JsonbDateFormat has all time units for class java.util.Date type, or consider using org.eclipse.yasson.YassonProperties#ZERO_TIME_PARSE_DEFAULTING.
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserializeInternal(AbstractContainerDeserializer.java:90)
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserialize(AbstractContainerDeserializer.java:60)
    at org.eclipse.yasson.internal.serializer.CollectionDeserializer.deserializeNext(CollectionDeserializer.java:106)
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserializeInternal(AbstractContainerDeserializer.java:84)
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserialize(AbstractContainerDeserializer.java:60)
    at org.eclipse.yasson.internal.serializer.ObjectDeserializer.deserializeNext(ObjectDeserializer.java:174)
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserializeInternal(AbstractContainerDeserializer.java:84)
    ... 182 more
Caused by: javax.json.bind.JsonbException: Error parsing class java.util.Date from value: 2016-07-14T21:00:00.000+0000. Check your @JsonbDateFormat has all time units for class java.util.Date type, or consider using org.eclipse.yasson.YassonProperties#ZERO_TIME_PARSE_DEFAULTING.
    at org.eclipse.yasson.internal.serializer.AbstractDateTimeDeserializer.deserialize(AbstractDateTimeDeserializer.java:71)
    at org.eclipse.yasson.internal.serializer.AbstractValueTypeDeserializer.deserialize(AbstractValueTypeDeserializer.java:64)
    at org.eclipse.yasson.internal.serializer.ObjectDeserializer.deserializeNext(ObjectDeserializer.java:174)
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserializeInternal(AbstractContainerDeserializer.java:84)
    ... 188 more
Caused by: java.time.format.DateTimeParseException: Text '2016-07-14T21:00:00.000+0000' could not be parsed, unparsed text found at index 23
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1952)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at org.eclipse.yasson.internal.serializer.DateTypeDeserializer.parseWithOrWithoutZone(DateTypeDeserializer.java:83)
    at org.eclipse.yasson.internal.serializer.DateTypeDeserializer.parseDefault(DateTypeDeserializer.java:54)
    at org.eclipse.yasson.internal.serializer.DateTypeDeserializer.parseDefault(DateTypeDeserializer.java:34)
    at org.eclipse.yasson.internal.serializer.AbstractDateTimeDeserializer.deserialize(AbstractDateTimeDeserializer.java:69)
    ... 191 more

Jax-RS 方法代码:

    @Override
    public BudgetRecipientsReferenceViewHolderResponse getBudgetRecipients(String language, DefaultRequest request, String sessionKey) {

        return ClientBuilder.newClient()
                .target(URI.create("http://127.0.0.1:8082/dboreferences/budgetRecipientsReferenceView/getAll"))
                .request(MediaType.APPLICATION_JSON)
                .header(GlobalConsts.SESSION_TOKEN, sessionKey)
                .post(Entity.entity(request, MediaType.APPLICATION_JSON), BudgetRecipientsReferenceViewHolder.class);
    }

响应 DTO 类

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
public class BudgetRecipientsReferenceViewHolder implements Serializable {

    private static final long serialVersionUID = -2971479083071002129L;

    private Long treasuryBranchCode;
    private String budgetRecipientAccount;
    private String budgetRecipientName;
    private boolean active;
    private String budgetRecipientINN;

    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd-MM-yyyy hh:mm:ss", timezone = "GMT+3")
    private Date openDate;

    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd-MM-yyyy hh:mm:ss", timezone = "GMT+3")
    private Date closeDate;
}

我在 Spring Boot 应用程序中有相同的类(在另一边)。我尝试使用不同的 Date 反序列化器,删除两边的 @JsonFormat,但它不起作用。

标签: javajsonspringjax-rs

解决方案


推荐阅读