Если вы используете java.util.Optional
, убедитесь, что вы зарегистрировали модуль com.fasterxml.jackson.datatype.jdk8.Jdk8Module
, который предоставляет дополнительные сериализаторы и десериализаторы.
В вашем случае самым простым способом было бы использовать аннотацию на уровнях свойств:
class Car {
@JsonInclude(JsonInclude.Include.NON_EMPTY)
Optional<String> ownerName;
@JsonInclude
String manufacturer;
//getters, setters
}
Значение по умолчанию - Include.ALWAYS
, которое следует использовать в вашем случае.
Если вы хотите сделать это глобально, вам нужно внедрить пользовательский фильтр и проверить все случаи вручную. Простой пример:
class CustomFilter {
@Override
public boolean equals(Object obj) {
// return false to keep value in response
// return true to filter out value from response
if (obj == null) {
return false;
}
if (obj instanceof Optional) {
Optional opt = (Optional) obj;
return !opt.isPresent();
}
//other cases if needed
return false;
}
}
Вы можете зарегистрировать его, как показано ниже:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(new Jdk8Module());
mapper.setDefaultPropertyInclusion(JsonInclude.Value.construct(JsonInclude.Include.CUSTOM, JsonInclude.Include.CUSTOM, CustomFilter.class, CustomFilter.class));
В случае, если это не то, что вам нужно, вам нужно установить наиболее подходящее значение в глобальном масштабе, и для заданного набора свойств другое значение. Если вы не можете изменить классы DTO
, вы всегда можете использовать функцию MixIn
.