RepositoryRestResource возвращает результаты в другом формате, чем RepositoryRestController - PullRequest
0 голосов
/ 28 октября 2018

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

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

. Возвращает все сущности Custodian, которые удовлетворяют условиям, сгруппированным в страницах.

Результат выглядит следующим образом:

{
  "_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-адрес и возвращает результат заново.результат (a 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 для доставки того же формата в нашем пользовательском методе?

...