我已经为我正在开发的Java Web App实现了一个类。该类有一个LocalDateTime属性' created'。但是,当我尝试设置该属性(一次)时,它的setter以某种方式连续调用两次 - 首先设置我想要的值,然后在第二次调用时将其设置为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是错误的,因为它不应该(并且不会调试)在这一点上做任何事情,但是为了完整性我会在这里添加它清酒。可能我现在只是抓住稻草。
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;
}
}
感谢您阅读我相当长篇文章的结尾。
答案 0 :(得分:1)
调试代码后,我发现了一条向下的行,将属性设置为null。事实上,这实际上是对二传手的第二次召唤以及很多坏运气,我想。
但是,知道其他因素没有任何问题可能会有所帮助,所以我只是把它留在这里。再次感谢。