Spring MVC - 如何根据查询参数返回不同的 JSON 响应?

Nar*_*esh 4 rest spring-mvc

我正在使用 Spring MVC 实现 REST api。要求是:

  1. /transactions返回交易数组。
  2. /transactions?groupByCategory返回按类别分组的交易。

例如请求#1 返回:

[
    { "id": 1, "category": "auto", "amount": 100 },
    { "id": 2, "category": "misc", "amount": 200 },
    { "id": 3, "category": "auto", "amount": 300 }
]
Run Code Online (Sandbox Code Playgroud)

而请求 #2 按类别对此结果进行分组并返回每个类别的总和:

[
    { "category": "auto", "amount": 400 },
    { "category": "misc", "amount": 200 }
]
Run Code Online (Sandbox Code Playgroud)

显然这些请求的返回值是不同类型的。我如何在 Spring MVC 中做到这一点?到目前为止我有:

@RequestMapping("/transactions")
public List<Transaction> getTransactions(
        @RequestParam(value="groupByCategory", required=false) String groupByCategory
        ) {

    ...
}
Run Code Online (Sandbox Code Playgroud)

但这将返回类型修复为List<Transaction>. 我如何适应第二种类型:List<TransactionSummaryByCategory>

编辑:我找到了一种解决方案,即将返回类型指定为Object. 这似乎有效,并且响应根据对象类型正确序列化。但是,我想知道这是否是最佳实践!

public Object getTransactions(...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 6

您只需在控制器中提供两种方法即可。第一个返回List<Transaction>映射使用

@RequestMapping("/transactions")
Run Code Online (Sandbox Code Playgroud)

第二个返回List<TransactionSummaryByCategory>并映射使用

@RequestMapping(value = "/transactions", params = "groupByCategory")
Run Code Online (Sandbox Code Playgroud)