RepositoryRestResource возвращает результаты в формате, отличном от RepositoryRestController

У меня проблема с использованием разных контроллеров Spring. Мы используем стандартный Spring PagingAndSortingRepository с пометкой RepositoryRestResource для обслуживания поисковых ответов. Один из способов -

Page<Custodian> findByShortNameContainingIgnoreCase(@Param("shortName") String shortName, Pageable p);

Он возвращает все объекты Custodian, которые удовлетворяют условиям, сгруппированным в Pages.

Результат выглядит так:

{
  "_embedded" : {
    "custodians" : [ {
      "shortName" : "fr-custodian",
      "name" : "french custodian",
      "contact" : "Francoir",
      "_links" : {
        "self" : {
          "href" : "http://127.0.0.1:9000/api/custodians/10004"
        },
        "custodian" : {
          "href" : "http://127.0.0.1:9000/api/custodians/10004"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://127.0.0.1:9000/api/custodians/search/findByShortNameContainingIgnoreCase?shortName=fr&page=0&size=3&sort=shortName,asc"
    }
  },
  "page" : {
    "size" : 3,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

Это формат, которого ожидает наш интерфейс.

Однако нам нужен другой запрос, который приводит к довольно длинной функции (и, следовательно, URL-адресу), потому что он принимает несколько параметров. Чтобы быть конкретным, он глобально ищет строку в Custodian. Таким образом, каждый параметр имеет одинаковое значение.

Чтобы сократить URL-адрес, мы создали RepositoryRestController, аннотированный ResponseBody, и реализовали функцию, которая принимает только один параметр, внутренне вызывает длинный URL-адрес и повторно возвращает результат (Page).

@RequestMapping(value = "/custodian", method = RequestMethod.GET)
public Page<Custodian> search(@RequestParam(value = "keyWord") String keyWord, Pageable p) {
    return repo.LONGURL(keyWord, keyWord, p);
}

К сожалению, Spring не применяет тот же формат к результату нашей функции.

Это выглядит так:

{
  "content" : [ {
    "id" : 10004,
    "shortName" : "fr-custodian",
    "name" : "french custodian",
    "contact" : "Francoir",
  } ],
  "pageable" : {
    "sort" : {
      "sorted" : true,
      "unsorted" : false
    },
    "offset" : 0,
    "pageSize" : 3,
    "pageNumber" : 0,
    "unpaged" : false,
    "paged" : true
  },
  "totalElements" : 3,
  "totalPages" : 1,
  "last" : true,
  "size" : 3,
  "number" : 0,
  "sort" : {
    "sorted" : true,
    "unsorted" : false
  },
  "numberOfElements" : 3,
  "first" : true
}

Как заставить Spring предоставлять тот же формат в нашем пользовательском методе?

Добро пожаловать в SO! :-) Не могли бы вы опубликовать реализацию метода с более коротким URL?

Peter Wippermann 29.10.2018 13:49
2
1
55
0

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