У меня есть проект в 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 вызывается.