2016-04-13 87 views
0

我有一個控制器,在某些情況下,如果請求是Restful,並且在某些情況下應該返回ModelAndView,它應該返回ResponseEntity<>單個Spring MVC控制器的多種返回類型

有沒有辦法可以做到這一點?我想我可以拋出異常取決於返回類型是什麼,然後有一個ExceptionHandler返回所需的確切類型。

例如,拋出一個ReturnResponseEntityException再搭上這在ExceptionHandler並返回ResponseEntity,而在另一種情況下拋出ReturnModelAndViewException

但是,我意識到這是行不通的,因爲ModelAndViewResponseEntity需要某些只在原始控制器中可用的屬性,而不是在異常處理程序中可用。有沒有辦法將屬性傳遞給異常處理程序?

另外,是否有可能從控制器返回對象,Spring將能夠處理ResponseEntityModelAndView,這取決於我返回的對象的類別?

或者有另一種方法來實現這一目標嗎?

+0

爲什麼要使用異常呢?你可以使用一個簡單的'if-then-else'來返回所需的對象。 – Sachin

+0

因爲在方法簽名中,您只有一個返回類型。你不能返回那種不是那種返回類型的東西 – rurounisuikoden

+3

爲什麼有相同的端點做不同的事情?這是糟糕的設計。 – dambros

回答

0

假設您使用Spring 4.2.x,可以使用MappingJacksonValue作爲MVC控制器的REST端點方法的返回類型。 MappingJacksonValue是一個圍繞java.lang.Object的包裝器對象,你可以從字面上包裝任何東西,將其內容轉換成JSON由Spring處理。我使用它來動態過濾我返回的內容 - 在運行時選擇基於URL參數,並且對於每個請求可以不同。包裝你的迴應很容易:

MyResponseObject response = createResponseObject(); 
    final MappingJacksonValue result = new MappingJacksonValue(response); 
    result.setFilters(createFilters(response)); 
    return result; 

在我看來,MappingJacksonValue是最近春天做的最大的新增功能之一!