Lombok @NonNull проверка на отсутствие проверки не работает с десериализацией Джексона - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть простой случай, когда я хочу применить нулевую проверку значений, найденных в строке JSON, при преобразовании строки JSON в POJO с использованием Jackson (2.8) и Lombok (последняя версия) в Java8.Но похоже, что @NonNull не выдает исключение, когда pojo создается с использованием ObjectMapper.convertValue, но работает нормально, когда pojo создается нормально с использованием шаблона компоновщика "?

, вот мой случай:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Lombok;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.extern.log4j.Log4j2;

@Log4j2
public class LearnJackson {
  public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

  public static void main(final String[] args) throws IOException {
      learnToConvertJsonToSimplePojo();
  }

  public static void learnToConvertJsonToSimplePojo() throws IOException {
    String jsonString = "{}";
    JsonNode node = OBJECT_MAPPER.readValue(jsonString, JsonNode.class);

    // this is supposed to throw NullPointerException
    MySimplePojo o = OBJECT_MAPPER.convertValue(node, MySimplePojo.class);
    log.info("o.getVar1: {}, o.getVar2: {}", o.getVar1(), o.getVar2()); // prints null

    // MySimplePojo.builder().build(); // this throws NullPointerException correctly
  }


  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Data
  public static class MySimplePojo {
    @NonNull
    private String var1;
    @NonNull
    private List<String> var2;
  }

}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Я вижу, вы нашли очевидное решение.Кстати, вы могли бы решить эту проблему, установив setter видимость на ObjectMapper.Смотрите полный пример.Поскольку Lombok генерирует байт-код, проверка на ноль находится внутри установщика, поэтому вы можете указать Джексону использовать их.

public class Main {
    public static void main(final String[] args) throws IOException {
        final String v = "{\"name\":\"YourName\",\"surname\":\"YourSurname\"}";
        final ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibilityChecker(
                mapper.getSerializationConfig().getDefaultVisibilityChecker()
                      .withGetterVisibility(Visibility.PUBLIC_ONLY)
                      .withSetterVisibility(Visibility.PUBLIC_ONLY)
        );

        final JsonNode jsonNode = mapper.readValue(v, JsonNode.class);
        System.out.println(jsonNode);

        final User user = mapper.convertValue(jsonNode, User.class);
        System.out.println(user);
    }

    private static class User {
        private String name;
        private String surname;

        public String getName() {
            return name;
        }

        public void setName(final String name) {
            if (name == null) {
                throw new NullPointerException();
            }

            this.name = name;
        }

        public String getSurname() {
            return surname;
        }

        public void setSurname(final String surname) {
            if (surname == null) {
                throw new NullPointerException();
            }

            this.surname = surname;
        }
    }
}
0 голосов
/ 19 февраля 2019

Нашел это.исправлено с помощью JsonDeserialize аннотации


  @NoArgsConstructor
  @AllArgsConstructor
  @Builder(builderClassName = "Builder", toBuilder = true)
  @Data
  @JsonDeserialize(builder = MySimplePojo.Builder.class)
  public static class MySimplePojo {
    @NonNull
    private String var1;
    @NonNull
    private List<String> var2;

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {
    }
  }

...