Цель
Как можно исключить все пустые объекты json {}
, массивы []
или массивы пустых объектов [{},{}]
из ответа JSON, выданного Джексоном в RestController
?
Требования и контекст
Я создаю Spring Rot API REST для клиента.
API отправляет запросы в базу данных и должен выдать ответ JSON.
Ограничения:
- Уровень DAO отправляет собственные запросы SQL и получает огромные результаты БД в виде списка. Разработчики должны вручную сопоставить этот результат с объектами Java с помощью индексов (см. Код ниже)
- SQL-запросы возвращают много нулевых значений (эти запросы НЕ МОГУТ быть изменены). Из-за этих нулевых значений часто создаются экземпляры Java-объектов, имеющих только нулевые поля
Требования:
- Все поля, имеющие нулевое значение, должны быть исключены из ответов JSON. Уже реализовано с использованием аннотации Jackson
@JsonInclude(JsonInclude.Include.NON_NULL)
- Все пустые объекты json
{}
или массивы []
, или массивы пустых объектов [{},{}]
должны быть исключены из ответа JSON. Вот где я застрял (см. Пример ниже)
код
Ручное отображение в слое DAO:
public List<A> daoMethod() {
List<Object[]> dbResult = getDbResults();
List<A> javaObjects = new ArrayList<>();
// build nested Java objects
for (Object[] line in dbResult) {
A a = new A();
a.setProp1(line[0]);
a.setProp2(line[1]);
// and so on...
javaObjects.add(a);
return javaObjects ;
}
}
Метод контроллера:
public ResponseEntity<A> controllerMethod() {
List<A> javaObjects = myDao.daoMethod();
return new ResponseEntity(javaObjects, HttpStatus.OK);
}
Все классы DTO, которые должны быть сериализованы в ответе JSON, расширяют класс BaseDto
:
@JsonInclude(JsonInclude.Include.NON_NULL) // removes all fields having NULL value
public abstract class BaseDto implements Serializable{
// some properties...
}
Фактические и ожидаемые результаты
Текущий вывод JSON:
{
prop1: "some string",
prop2: [{},{},{}],
prop3: [],
prop4: {},
}
Ожидаемое:
{
prop1: "some string"
}