2016-02-11 3 views
0

Я реализовал класс для 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; 
} 
} 

шаги, которые я взял пытается решить эту

  1. Снятие @Transient. Данные заполняются через Hibernate (ver.5.1), и я изначально аннотировал свойство, так как само поле не находится в соответствующей таблице базы данных. Я думал, что это может быть проблемой (см. Object Serialization and Java Transient Variables), но удаление его ничего не изменило.

  2. Изменение третьей строки. Я переключил его с тем, что было в основном внутри статического метода LocalDateUtils. Это не решило проблему.

    LocalDateTime uploadDate = uploaded.toInstant().atZone(ZoneId.of("UTC")).toLocalDateTime(); 
    
  3. Удаление 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; 
    } 
    } 
    

Спасибо за чтение до конца моего довольно длинного поста.

+0

Вы отлажены в этом? Установите контрольную точку в' setCreated' и вы можете посмотреть стек вызовов на каждый вызов ... –

+0

Или если вы не можете легко отладить, вы можете распечатать трассировку стека в сеттере, чтобы узнать, какой метод ее вызывает. – assylias

+0

@andante, следуйте комментариям @ JonSkeet, так как вы Вероятно, вы дважды вызываете метод 'mapDocumentFromSOLR'. – aribeiro

ответ

1

После отладки кода я нашел строку ниже, которая задала свойство null. Так что на самом деле это был второй звонок сеттера и много неудач, я полагаю.

Но это может помочь узнать, что там не было ничего плохого с другими факторами, так что я "буду просто оставить это здесь. Еще раз спасибо.

Смежные вопросы