2012-01-10 50 views
8

我有一個帶有Web控制器方法的Spring 3.0應用程序。此方法通常會在http響應中返回一個文件,因此我使用返回類型org.springframework.http.HttpEntity。但現在還有第二個要求:如果文件大於1MB,並且在10點以後,則應顯示HTML頁面。如何在Spring中替換HttpEntity和ModelAndView之間的Web控制器響應

所以我的問題是,該方法有時必須返回一個HttpEntity<byte[]>,有時一個ModelAndView。但是,怎麼能有這兩種不同類型的返回類型呢?

確定的要求不是10時,它是要複雜得多,但問題是,這dessicion只能在控制器製成。

(此應用程序使用經典JSPX用於呈現HTML頁面)

+0

重定向?然後你有兩個入口點,兩個請求。 – 2012-01-10 18:19:52

+0

@Joop Eggen:好主意,也許是前鋒,那麼我沒有兩個要求。 – Ralph 2012-01-10 18:25:04

回答

7

它太容易了(遺憾的問題):一個可以返回類型爲Object定義的方法,所以人們可以返回ModelAndViewHttpEntity實例。

這工作,因爲AnnotationMethodHandlerAdapter#getModelAndView取返回值作爲Object,然後有一個IF-THEN-ELSE級聯有很多inncstanceof報表來確定concreate實例類型。


如果一個認爲返回類型Object太常見的,那麼可以定義它自己的類(化合物類),巫包含在兩個不同的字段ModelAndViewHttpEntity。然後一個人必須寫一個自定義ModelAndViewResolver

此自定義ModelAndViewResolver採取化合物對象和

  • 返回一個模型和視圖如果它是化合物類爲ModelAndView
  • 更新webRequestAnnotationMethodHandlerAdapter#handleHttpEntityResponse確實,然後返回null
+0

+1,@Ralph。我想過要返回Object但不確定。很高興知道。 – AlexR 2012-01-10 21:31:46

1

我認爲這裏更好的解決方案是使用常規的HTTP過濾器來檢查條件並將請求轉發到「正常」流或HTML頁面。

這可以讓你解耦你的邏輯。將來可能會有另一個要求將請求轉發到另一條路徑。你可以在另一個過濾器中實現它。

過濾器可以使用相同的Spring上下文,因此使用相同的豆子,DB等

編輯。也想想Spring攔截器。我個人沒有使用這種技術,但它也可以在這裏幫助。

相關問題