我为正在使用的Java Web App实现了一个类。该类具有“已创建”的LocalDateTime属性。但是,当我尝试设置该属性(一次)时,以某种方式连续两次调用了它的设置器-首先设置我想要的值,然后在甚至不应该发生的第二次调用中将其设置为null。

我已经通过以下方法进行了跟踪,一切看起来都达到了第三行。

public static ICEDocument mapDocumentFromSOLR(SolrDocument document) {

    ICEDocument result = new ICEDocument();
    Date uploaded = (Date) document.getFieldValue("CREATED");
    LocalDateTime uploadDate = LocalDateUtils.convertUtcDateToLocalDateTime(uploaded); // custom class
    result.setCreated(uploadDate); // **faulty line**
}


这是课程,为清楚起见已缩短:

import java.time.LocalDateTime;
import org.springframework.data.annotation.Transient;
[...]

@JsonIgnoreProperties(ignoreUnknown=true)
public class ICEDocument implements java.io.Serializable {
[...]

@Transient
private LocalDateTime created;
[...]

@JsonDeserialize(using=LocalDateTimeJsonDeserializer.class)
public void setCreated(LocalDateTime created) {
    System.out.println("Setting creation date " + created);  // added for debugging
    this.created = created;
}
}


我已尝试解决此问题的步骤


删除@Transient。数据是通过Hibernate(ver5.1)填充的,由于字段本身不在相应的数据库表中,因此我最初对该属性进行了注释。我认为这可能是问题所在(请参见Object Serialization and Java Transient Variables),但是将其删除并没有任何改变。
更改第三行。我用静态LocalDateUtils方法中的内容进行了切换。这不能解决问题。

LocalDateTime uploadDate = uploaded.toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime();

删除JSON反序列化器。我不认为JsonDeserializer有问题,因为在这一点上它不应该做任何事情(并且不符合Debug的要求),但是出于完整性考虑,我将在此处添加它。可能是我现在只是在吸管了。

public class LocalDateTimeJsonDeserializer extends JsonDeserializer<LocalDateTime> {

private static final String DATE_TIME = "yyyy-MM-dd' 'HH:mm:ss";

@Override
public LocalDateTime deserialize(JsonParser parser, DeserializationContext context)
    throws IOException, JsonProcessingException {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_TIME);
    LocalDateTime deserializedDate = LocalDateTime.parse(parser.getText(), formatter);
    return deserializedDate;
}
}



感谢您阅读我的较长帖子的结尾。

最佳答案

调试代码后,我发现在其下一行将属性设置为null。我想这实际上是第二次给塞特犬打电话,并带来很多厄运。

但这可能有助于知道其他因素没有任何问题,因此我将其留在这里。再次感谢。

10-07 18:28