2013-06-29 99 views
3

我正在使用Spring MVC并返回JSON作为响应。我想创建一个通用的JSON响应,我可以把任何类型和要应对这个样子spring generic 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控制器中返回空响应对象和/或填充的响应对象。提前

感谢GM

UPDATE:

为了获得类似JSON输出所描述的,即以“帐户”键JSON,我不得不使用Response<Map<String, List<Account>>>的以下在控制器中:

@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输出中的“账户”密钥?

+0

这是一个有用的共同响应实体。 – Wuaner

回答

0

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

你会希望确保你的classpath上有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 

} 

,然后在春天控制器,你可以返回从你的方法该对象被映射与@RequestMapping

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

嗨尼古拉斯,谢谢你的回复。我更新了我的问题。这是获取JSON中“帐户”键的正确方法吗? – user2279337

+0

我确实相信这会起作用。 –