2013-03-20 80 views
1

ExceptionHandler可以返回ModelAndView,Model,Map等。是否可以返回我自己類型的對象並註冊一些轉換器,它可以將我的類型轉換爲Spring可以理解的類型之一?例如:春季任意返回類型mvc

@ExceptionHandler 
public MyType handle(Exception e) { 
    ... 
} 

@SomeTransformer 
public Map convert(MyType myObject) { 
    ... 
} 

回答

1

ExceptionHandler方法遵循Controller方法遵循的同樣的約定。 Here's Spring 3.1中Spring MVC控制器方法支持的所有返回類型的列表。子彈#7將是你最感興趣的。

相關部分:

16.3.3.2支持方法返回類型

以下是所支持的返回類型:

  • 甲ModelAndView對象,與模型隱含地充實了命令對象和@ModelAttribute帶註釋的引用數據訪問器方法的結果。

  • 模型對象,具有視圖名稱隱含通過RequestToViewNameTranslator並用命令對象隱含豐富了模型和註釋@ModelAttribute基準數據存取方法的結果來確定。

  • 用於公開模型的Map對象,其視圖名稱通過RequestToViewNameTranslator隱式確定,模型隱式地增加了命令對象和@ModelAttribute註釋引用數據訪問器方法的結果。

  • 一個View對象,模型通過命令對象和@ModelAttribute帶註釋的引用數據訪問器方法隱式確定。處理程序方法也可以通過聲明一個Model參數來以編程方式豐富模型(參見上文)。

  • 被解釋爲邏輯視圖名稱的字符串值,該模型通過命令對象和@ModelAttribute帶註釋的引用數據訪問器方法隱式確定。處理程序方法也可以通過聲明一個Model參數來以編程方式豐富模型(參見上文)。

  • 如果方法自己處理響應(通過直接寫入響應內容,爲此目的聲明ServletResponse/HttpServletResponse類型的參數),或者視圖名稱應該通過RequestToViewNameTranslator隱式確定(不聲明處理程序方法簽名中的響應參數)。

  • 如果該方法使用@ResponseBody進行註釋,則返回類型將寫入響應HTTP主體。使用HttpMessageConverters將返回值轉換爲聲明的方法參數類型。請參見第16.3.3.5節「使用@ResponseBody註釋映射響應主體」。

  • 一個HttpEntity或ResponseEntity對象,用於提供對Servlet響應HTTP頭和內容的訪問。使用HttpMessageConverters將實體主體轉換爲響應流。請參見第16.3.3.6節「使用HttpEntity」。

其他任何返回類型被認爲是要被暴露於視圖中的單個模型屬性,使用通過@ModelAttribute在方法級別中指定的屬性名稱(或基於返回類型類的默認屬性名稱名稱)。該模型隱含地豐富了命令對象和@ModelAttribute帶註釋的引用數據訪問器方法的結果。

1

當然你也可以在建議後用aspectj做你想做的事情。

private pointcut transformer() : execution(@SomeTransformer * *(..)); 

after() returning (Object o): transformer() { 
     System.out.println("I'd like to transform this object " + o); 
} 

但是..我不知道你爲什麼要這樣做..?

免責聲明:這是未經測試的。

+0

+1爲好主意。如果應用程序規劃得足夠大,方面可能是最乾淨的方式 – piotrek 2013-04-03 12:42:32