LocalDateTime(Java 8 API)的Setter被调用两次

时间:2016-02-11 15:45:46

标签: java java-ee java-time

我已经为我正在开发的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;
}
} 

我尝试解决此问题的步骤

  1. 删除@Transient 。数据通过Hibernate(ver5.1)填写,我最初注释了属性,因为字段本身不在相应的数据库表中。我认为这可能是问题所在(请参阅Object Serialization and Java Transient Variables),但删除它并没有改变任何内容。

  2. 更改第三行。我用基本上在静态LocalDateUtils方法中的内容切换它。这并没有解决问题。

    LocalDateTime uploadDate = uploaded.toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime();
    
  3. 删除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;
    }
    }
    
  4. 感谢您阅读我相当长篇文章的结尾。

1 个答案:

答案 0 :(得分:1)

调试代码后,我发现了一条向下的行,将属性设置为null。事实上,这实际上是对二传手的第二次召唤以及很多坏运气,我想。

但是,知道其他因素没有任何问题可能会有所帮助,所以我只是把它留在这里。再次感谢。