Spring hatoas jaxrslinkbuilder добавляет пустые поля

Я пытаюсь добавить ссылки HATEOAS в результаты моего контроллера. Создание ссылки:

       Link link = JaxRsLinkBuilder.linkTo(MainRestService.class)
                    .slash(this::getVersion)
                    .slash(LinkMappingConstants.TAXPAYERS)
                    .slash(taxPayerId)
                    .slash(LinkMappingConstants.ESTIMATIONS)
                    .slash(estimationId)
                    .withSelfRel();

Сама ссылка создается нормально, но в полученном JSON есть лишние записи:

"links": [
        {
          "rel": "self",
          "href": "http://localhost:8080/blablabla",
          "hreflang": null,
          "media": null,
          "title": null,
          "type": null,
          "deprecation": null,
          "template": {
            "variables": [

            ],
            "variableNames": [

            ]
          }
        }
      ]

Как я могу получить этот формат? (без свойства использования spring.jackson.default-property-inclusion=NON_NULL)

"links": [
        {
          "rel": "self",
          "href": "http://localhost:8080/blablabla"
        }
      ]

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
349
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы упомянули, если вы хотите включить свойство NON_NULL во весь JSON, а не только links, вы можете использовать spring.jackson.default-property-inclusion=NON_NULL. Однако это не исправит пустые поля шаблона.

Если вы хотите включить свойство NON_NULL только для объекта Link, используя Jackson для сериализации, вы можете добиться этого, используя Джексон MixIn для объекта Link с аннотацией @JsonInclude(Include.NON_NULL).

Например:

@JsonInclude(Include.NON_NULL)
abstract class LinkMixIn {
}
mapper.addMixIn(Link.class, LinkMixIn.class);

Чтобы скрыть поля шаблона, вы можете либо добавить @JsonIgnore, если вы никогда не хотите сериализовать раздел шаблона, либо попробовать включение свойства NON_DEFAULT в ответ выше, который создает новый экземпляр объекта и сравнивает его с тем, что должно быть сериализовано, чтобы определить если он должен быть включен.

Например. что-то вроде следующего вообще не будет сериализовать результат getTemplate

@JsonInclude(Include.NON_NULL)
abstract class LinkMixIn {
    @JsonIgnore abstract Template getTemplate();
}

В любом случае с этим свойством поле "шаблон" останется.

kros365 07.06.2019 11:16

@ kros365 Это правда - для этого потребуется дополнительная настройка MixIn (либо NON_DEFAULT, либо игнорирование), я обновлю свой ответ, чтобы отразить это.

MarkRobbo 07.06.2019 11:18

Я использую org.springframework.hateoas.ResourceSupport и JaxRsLinkBuilder для создания ссылки. Не проблема создать пользовательскую ссылку, просто я подумал, что есть способ настроить это решение.

kros365 07.06.2019 11:33

@ kros365 ответ выше должен охватывать настройку сериализации в соответствии с вашим запросом, либо с помощью JsonIgnore, чтобы полностью игнорировать свойства, либо скрывать их только тогда, когда они равны нулю. Дайте мне знать, если что-то не ясно.

MarkRobbo 07.06.2019 11:39

Другие вопросы по теме