如何在Spring中为JSON API建模自定义请求参数?

时间:2017-10-11 19:04:50

标签: spring json-api

我目前正在尝试建模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
}

然后模拟出FiltersSortingPaging。然后,此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)?

1 个答案:

答案 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,将sortpage字段转换为Spring Pageable请求。轻松转换,无缝工作。