2016-03-23 82 views
0

我正在編寫一個使用Jersey2和Spring的REST API,我想將結果JSON表達式格式化爲更具體的東西,我不知道是否應該修改POJO的結構或格式上的ressource格式JSON結果表達式

實際JSON

Response [ { 
    "rcId" : 22900, 
    "posId" : 595, 
    "status" : "PERC6", 
    "dateFrom" : 1438380000000, 
    "dateTo" : 1442095200000, 
    "creaDate" : 1442349754000 
    "createdBy": "52e28419-2c48-526d-8e7c-783cf331e071", 
    "modifiedBy": "52e28419-1725-84bd-9884-6969e7b9b876", 
} ] 

誠徵格式化JSON響應

Response [ { 
    「results」: { 
     "rcId" : 22900, 
     "posId" : 595, 
     "status" : "PERC6", 
     "dateFrom" : 1438380000000, 
     "dateTo" : 1442095200000, 
     "creaDate" : 1442349754000 
     "createdBy": "52e28419-2c48-526d-8e7c-783cf331e071", 
     "modifiedBy": "52e28419-1725-84bd-9884-6969e7b9b876", 
    } 
    "related": { 
     "52e28419-2c48-526d-8e7c-783cf331e071": { "user/username" : "test" } 
     "52e28419-1725-84bd-9884-6969e7b9b876": { 「user/username」 : 「test」 } 
    } 
    "errors": [ ... If errors while executing query... ] 
} 

我的目標看起來像這樣

@Entity 
@Table(name="STATUS") 
@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class RcPosStatus implements Serializable { 

private static final long serialVersionUID = -8039686696076337853L; 

@Id 
@Column(name="RC_ID") 
@XmlElement(name = "RC_ID") 
private Long rcId; 

@Column(name="POS_ID") 
@XmlElement(name = "POS_ID")  
private Long posId; 

@Column(name="STATUS") 
@XmlElement(name = "STATUS")  
private String status; 


@Column(name="DATE_FROM") 
@XmlElement(name = "DATE_FROM") 
private Date dateFrom; 

@Column(name="DATE_TO") 
@XmlElement(name = "DATE_TO") 
private Date dateTo; 

@Column(name="CREA_DATE") 
@XmlElement(name = "CREATION_DATE") 
private Date creaDate; 

我的資源

@GET 
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
public List<RcPosStatus> getRcPosStatus(
     @QueryParam("orderByInsertionDate") String orderByInsertionDate, 
     @QueryParam("numberDaysToLookBack") Integer numberDaysToLookBack) 
     throws IOException, AppException { 
      List<RcPosStatus> status = statusService.getRcPosStatus(
      orderByInsertionDate, numberDaysToLookBack); 
    return status; 
} 

回答

0

我建議你創建的DTO(數據傳輸對象)。您不應該更改數據模型來表示REST端點的結果。原因是因爲客戶的需求隨着時間的推移而變化,擁有一個穩定的實體模型非常重要。

它是架構要如何組織的DTO的問題,這裏有一個例子,如果我理解你的模型正確:

public class DefaultResponseDTO<Foo, Bar> implements Serializable { 
    private ArrayList<Foo> results; 
    private ArrayList<Bar> related; 
    private ArrayList<Errors> errors; 
    ... 
} 

現在用它來創建響應你想

... //fetches data from resources and starting to map response. 
DefaultResponseDTO<Pojo, Pojo> response = new DefaultResponseDTO(); 
response.results = results; //some results you want to return, Entities 
response.related = releated; //some results you want to return as related, Entities 
response.errors = errors; 
return response; 

使用泛型可讓您創建一個適合您需求的默認響應,並幫助您保持乾淨整潔的API。這裏是我喜歡使用的列表對象,它具有關於我在客戶端用於分頁的列表的元數據:http://pastebin.com/mTU4qbc7

+0

Tkx Gulbrandsen,這顯然是我要找的 – kyserslick