У меня проблема с использованием разных контроллеров 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?