Учитывая следующий класс:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Account {
[... A lot of serialized properties]
@JsonSerialize(nullsUsing = JacksonSpringSpelSerializer.class, using = JacksonSpringSpelSerializer.class)
@JsonView(View.Contract.class)
@Value("#{@contractService.getActiveContract(#this)}")
public Contract activeContract;
}
По существу, свойство activeContract
равно нулю, и его значение оценивается только при условии правильного @JsonView, значение вычисляется выражением Spring Spel, все делается в пользовательском сериализаторе JacksonSpringSpelSerializer
.
Все работает как положено, НО вычисленное значение иногда может быть нулевым, что является нормальным, и я получаю json, например:
{
[... All properties],
"activeContract": null
}
Проблема в том, что я не хочу, чтобы нулевые свойства были в возвращенных json, @JsonInclude(JsonInclude.Include.NON_EMPTY)
игнорируется, когда для свойства установлен настраиваемый сериализатор.
Немного покопавшись, я обнаружил, что пользовательский сериализатор вызывается BeanPropertyWriter.serializeAsField()
, который содержит:
if (value == null) {
if (_nullSerializer != null) {
gen.writeFieldName(_name);
_nullSerializer.serialize(null, gen, prov);
}
return;
}
Таким образом, имя поля записывается gen.writeFieldName(_name);
до того, как пользовательский сериализатор на самом деле вызвал, и я не нашел надлежащего способа предотвратить это поведение или удалить нулевые свойства, сгенерированные пользовательским Serializer.
Есть ли правильный способ для достижения такого результата? Любой совет будет очень кстати: D
Спасибо <3 </p>