2016-12-14 64 views
0

從您的角度來看,從Spring REST控制器返回簡單對象的最佳方法是什麼?彈簧控制器 - 返回地圖而不是創建單獨的對象

一種方法是創建一個對象

@RestController 
public MyObj x(){...} 

class MyObj { 
    String a; 
    List<String> bList; 
} 

如果你有這樣的,你將最終爲每個對象很多單獨的文件的多個對象。

另一種方法是使用地圖

@RestController 
public Map<String, List<String>>x(){ 
    return service...dao.getInfo(); 
} 

public Map<String, List<String>> dao.getInfo() {...} 

這是一個有點難以閱讀,你需要去的DAO,看看它返回。它需要一個非常好的文檔。

是否有任何其他方式獲得類似的行爲?

映射是在服務體系結構中解決此問題的好方法嗎?

+0

回報'使用'Iterateable' ResponseEntity';) – emotionlessbananas

回答

1

我認爲最好的方法是創建一個通用對象RestResponse,其中包含通用的有效載荷。然後有一個能夠爲您的有效載荷創建正確響應的工廠。

RestResponse:

public class RestResponse<T> { 
    private int responseCode; 
    private T payload; 

    public RestResponse() { 
    } 

    public RestResponse(int responseCode) { 
     this.responseCode = responseCode; 
    } 

    public T getPayload() { 
     return payload; 
    } 

    public void setPayload(T payload) { 
     this.payload = payload; 
    } 
} 

廠:

@Component 
public class RestResponseFactory { 
    public <T> ResponseEntity<RestResponse<T>> newRestResponse(HttpStatus status) { 
     return newRestResponse(null, status); 
    } 

    public <T> ResponseEntity<RestResponse<T>> newRestResponse(T resource, HttpStatus status) { 
     RestResponse<T> response = new RestResponse<T>(); 
     response.setResponseCode(status.value()); 
     response.setPayload(resource); 
     return new ResponseEntity<RestResponse<T>>(response, status); 
    } 
} 

然後在您休息控制器,你應該能夠使用工廠來生成有效載荷。

ResponseEntity<RestResponse<MyRessource>> response = 
    responseFactory.newRestResponse(new MyRessource("SomeData"), HttpStatus.CREATED); 

這將允許您生成任意對象以下控制器響應:

@Controller 
@EnableAutoConfiguration 
public class MyRessourceController { 

    @ResponseBody 
    @RequestMapping(value = "/dosomething", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
    ResponseEntity<RestResponse<MyRessource>> dosomething() { 

     ResponseEntity<RestResponse<MyRessource>> response = 
       responseFactory.newRestResponse(new MyRessource("SomeData"), HttpStatus.CREATED); 


     return response; 
    } 

}