【问题标题】:spring generic json response春季通用json响应
【发布时间】:2013-06-29 20:57:07
【问题描述】:

我使用Spring MVC 并返回JSON 作为响应。我想创建一个通用的JSON 响应,我可以在其中输入任何类型并希​​望响应看起来像这样

{
    status : "success",
    data : {
        "accounts" : [
            { "id" : 1, "title" : "saving", "sortcode" : "121212" },
            { "id" : 2, "title" : "current", "sortcode" : "445566" },
        ]
     }
}

所以我创建了一个Response<T> 对象

public class Response<T> {

    private String status;
    private String message;
    T data;
...
...
}
  1. 这是正确的做法,还是有更好的方法?
  2. 如何在Spring 控制器中使用此响应对象来返回空响应对象和/或填充响应对象。

提前感谢总经理

更新:

为了获得与上述类似的JSON 输出,即在JSON 中使用“accounts”键,我必须在控制器中使用Response&lt;Map&lt;String, List&lt;Account&gt;&gt;&gt;

@RequestMapping(value = {"/accounts"}, method = RequestMethod.POST, produces = "application/json", headers = "Accept=application/json")
    @ResponseBody
    public Response<Map<String, List<Account>>> findAccounts(@RequestBody AccountsSearchRequest request) {
        //
        // empty accounts list
        //
        List<Account> accountsList = new ArrayList<Account>();

        //
        // response will hold a MAP with key="accounts" value="List<Account>
        //
        Response<Map<String, List<Account>>> response = ResponseUtil.createResponseWithData("accounts", accountsList);

        try {
            accountsList = searchService.findAccounts(request);

            response = ResponseUtil.createResponseWithData("accounts", accountsList);
            response.setStatus("success");
            response.setMessage("Number of accounts ("+accounts.size()+")");
        } catch (Exception e) {
            response.setStatus("error");
            response.setMessage("System error " + e.getMessage());
            response.setData(null);
        }

        return response;
    }

这是正确的做法吗?即为了在JSON 输出中获取“帐户”键?

【问题讨论】:

  • 这是一个有用的通用响应实体。

标签: java json spring spring-mvc


【解决方案1】:

虽然您的示例 JSON 无效(statusdata 未包含在引号中),但此方法将有效。

您需要确保您的类路径中有 Jackson jar,其余的由 Spring 处理。

为了让它工作,我会为你的响应类创建一个构造函数,看起来像这样:

public class Response<T> {

    private String status;
    private String message;
    private T data;

    public Response(String status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    //...getter methods here

}

然后在您的 Spring 控制器中,您只需从使用 @RequestMapping 映射的方法中返回此对象

@Controller
public class MyController {
    @RequestMapping(value="/mypath", produces="application/json")
    public Response<SomeObject> myPathMethod() {
        return new Response<SomeObject>("200", "success!", new SomeObject());
    }
}

【讨论】:

  • 嗨,尼古拉斯,感谢您的回复。我已经更新了我的问题。这是在 JSON 中获取“帐户”键的正确方法吗?
  • 记得放getterssetters。否则,响应返回空对象!
猜你喜欢
  • 2017-06-19
  • 2015-08-31
  • 2019-10-21
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多