Джексон ObjectMapper игнорирует JsonInclude.Include.NON_NULL - PullRequest
0 голосов
/ 04 января 2019

У меня есть проект в Spring Boot 1.5.2. По какой-то причине я не смог заставить ObjectMapper игнорировать пустые поля во время сериализации. Вот настройки:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class CustomerInfo{
  private Long customerId;
  private String fullName;
  //some more fields
  //getters and setters
}

@Service
public class ObjectMapperTester{
  @Autowired
  private ObjectMapper objectMapper;

  public void test(){
     CustomerInfo ci = new CustomerInfo;
     ci.setFullName("Foo");
     objectMapper.writeValueAsString(ci);
     //I get JsonMappingException here
  }
}

До сих пор я всегда использовал аннотацию @JsonInclude(JsonInclude.Include.NON_NULL) со своими классами, чтобы игнорировать пустые поля. Это прекрасно работает, когда я возвращаю любой объект в методах RestController, поэтому я не вижу пустых полей в выходных данных ответа. Но этот сопротивляется работе. Я получаю исключение при попытке writeValueAsString, когда поле customerId имеет значение null. ObjectMapper пытается получить значение customerId через getter, который, в свою очередь, выполняет следующие действия:

 //In fact compiler transforms the getter to be so, otherwise I just return the customerId.
 return this.customerId.longValue();

И это, конечно, создает исключение NullPointerException.

Я пытался вручную указать мапперу игнорировать пустые поля во время сериализации:

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

Но это тоже не помогает. Есть другие идеи?

UPDATE

Я как-то разобрался в проблеме. Фактически, тип поля customerId был примитивом long. Затем я изменил его на Long без использования рефакторинга IDE, в результате чего получатель получился следующим образом:

public long getCustomerId(){
  return customerId;
}

И компилятор преобразовал его в

public long getCustomerId(){
  return customerId.longValue();
}

После исправления типа возвращаемого значения получателя на Long проблема была решена, и я действительно не получаю поле customerId в выводе. Но метод getCustomerId () все еще вызывается. Вот почему я сказал sort of. Зачем мапперу нужно вызывать геттер, если он его игнорирует? Я попытался удалить аннотацию для всего класса и добавил ее в поля. Но все же метод getter вызывается.

...