NullPointerException при сериализации объекта в Json - PullRequest
0 голосов
/ 28 января 2019

У меня есть объект типа User (как определено ниже), который при сериализации в Json выдает эту конкретную ошибку:

com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.providenceuniversal.gim.AuthenticationRequest["user"]->com.providenceuniversal.gim.User["lastSeenToLocal"])

User определение (с соответствующими свойствами и методами):

public class User implements ServerMessage {

    //.....

    private final @JsonInclude(Include.NON_NULL) Instant lastSeen;

    @JsonCreator
    User(@JsonProperty("username") String username) {
            if (!isValidUsername(username))
                  throw new IllegalArgumentException("Invalid constructor argument values");
            this.username = username.trim();
            this.firstName = null;
            this.lastName = null;
            this.email = null;
            this.status = null;
            this.joinDate = null;
            this.lastSeen = null;
            this.dateOfBirth = null;
    }

    @JsonCreator
    User(
         @JsonProperty("username") String username,
         @JsonProperty("firstName") String firstName,
         @JsonProperty("lastName") String lastName,
         @JsonProperty("email") String email,
         @JsonProperty("status") String status,
         @JsonProperty("joinDate") Instant joinDate,
         @JsonProperty("lastSeen") Instant lastSeen,
         @JsonProperty("dateOfBirth") LocalDate dateOfBirth) {

            if (username == null || username.trim().length() == 0)
                  throw new IllegalArgumentException("Invalid constructor argument values");
            this.username = username.trim();
            this.firstName = firstName;
            this.lastName = lastName;
            this.email = email;
            this.status = status;
            this.joinDate = joinDate;
            this.lastSeen = lastSeen;
            this.dateOfBirth = dateOfBirth;
    }

    //.....

    public Instant getLastSeen() {
            return lastSeen;
    }

    public LocalDateTime getLastSeenToLocal() {
            return getLastSeen().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

Из исключения очевидно, что проблема вызвана методом getLastSeenToLocal() (который пытается манипулировать объектом null в lastSeen), отношение которого к процессу сериализации я не могуувидеть.Джексон по умолчанию вызывает всех получателей независимо от того, указаны ли возвращаемые поля как JsonProperty s, или я что-то упускаю (ясно)?

1 Ответ

0 голосов
/ 28 января 2019

Джексон по умолчанию использует getters () класса.Таким образом, вы можете

  • Использовать @JsonAutoDetect для использования полей
  • Добавить @JsonIgnore для метода getLastSeenToLocal ()
  • улучшить getLastSeenToLocal (), чтобы проверить, что связанные поля не равны нулю (или любые другие условия)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...