我目前正在尝试建模JSON API的查询参数结构并将其用于我的Spring Boot项目。我将专注于filters,排序,分页,以及字段限制。
我想先从过滤开始,所以我希望我的REST端点能够处理JSON-API样式的URL请求,例如
GET /comments?filter[post]=1 HTTP/1.1
GET /comments?filter[post]=1,2 HTTP/1.1
GET /comments?filter[post]=1,2&filter[author]=12 HTTP/1.1
我的计划是捕获顶级JsonApiParams
对象中的所有JSON API特定查询参数,如:
public class JsonApiParams {
private Filters filters;
private Sorting sorting;
private Paging paging;
// getters, setters
}
然后模拟出Filters
,Sorting
,Paging
。然后,此JsonApiParams
对象将被接受为@RestController
端点中的请求参数,如下所示:
@RequestMapping(value = {"/api/v1/{entity}"},
method = RequestMethod.GET,
produces = {"application/vnd.api+json"})
@ResponseBody
public JsonApiTopLevel jsonApiGetByEntity(@PathVariable String entity, JsonApiParams params) {
// convert params to DB query
}
那么,我应该如何建模我的JsonApiParams
对象以便能够处理上述请求(例如/comments?filter[post]=1,2&filter[author]=12
)?
答案 0 :(得分:0)
幸运的是,Spring开箱即用的地图使用括号表示法。我能够使用以下模型格式化我的URL查询参数,如/comments?filter[post]=1,2&filter[author]=12
:
public class JsonApiParams {
private Map<String, List<String>> filter;
private List<String> sort;
private Map<JsonApiPaginationKeys, Integer> page;
// getters & setters
}
然后,在我的情况下,我将过滤器转换为QueryDSL Predicate
,将sort
和page
字段转换为Spring Pageable
请求。轻松转换,无缝工作。