我为正在使用的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。我想这实际上是第二次给塞特犬打电话,并带来很多厄运。
但这可能有助于知道其他因素没有任何问题,因此我将其留在这里。再次感谢。