Я реализовал класс для Java Web App, над которым я работаю. Класс имеет свойство LocalDateTime 'created'. Тем не менее, когда я пытаюсь установить это свойство (один раз), его сеттер каким-то образом вызывается дважды подряд - сначала установите значение, которое я хочу, а затем установите для него значение null во втором вызове, который не должен даже произойти.Setter для LocalDateTime (Java 8 API) получает вызов дважды
Я проследил следующий метод, и все выглядит хорошо до третьей строки.
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 (ver.5.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; } }
Спасибо за чтение до конца моего довольно длинного поста.
Вы отлажены в этом? Установите контрольную точку в' setCreated' и вы можете посмотреть стек вызовов на каждый вызов ... –
Или если вы не можете легко отладить, вы можете распечатать трассировку стека в сеттере, чтобы узнать, какой метод ее вызывает. – assylias
@andante, следуйте комментариям @ JonSkeet, так как вы Вероятно, вы дважды вызываете метод 'mapDocumentFromSOLR'. – aribeiro