如何在Spring中替换HttpEntity和ModelAndView之间的Web控制器响应

时间:2012-01-10 18:10:05

标签: java spring

我有一个带有Web控制器方法的Spring 3.0应用程序。此方法通常在http响应中返回一个文件,因此我使用了返回类型org.springframework.http.HttpEntity。但是现在有第二个要求:如果文件大于1MB并且在10点之后,则应显示HTML页面。

所以我的问题是,该方法有时应返回HttpEntity<byte[]>,有时返回ModelAndView。但是如何才能拥有这两种不同类型的返回类型?

好的,要求不是10点,它要复杂得多,但关键是,这种干扰只能在控制器中进行。

(此应用程序使用经典JSPX呈现HTML页面。)

2 个答案:

答案 0 :(得分:7)

太容易了(抱歉问题):可以使用返回类型Object定义方法,因此可以返回ModelAndViewHttpEntity的实例。

这是有效的,因为AnnotationMethodHandlerAdapter#getModelAndView将返回值作为Object,然后有一个带有很多inncstanceof语句的if-then-else级联来确定concreate实例类型。


如果有人认为返回类型Object太常见,那么可以定义自己的类(复合类),在两个不同的字段中包含ModelAndViewHttpEntity 。然后必须编写自定义ModelAndViewResolver

此自定义ModelAndViewResolver采用复合对象和

  • 返回一个模型并查看它是ModelAndView还是
  • 的复合类
  • webRequest那样更新AnnotationMethodHandlerAdapter#handleHttpEntityResponse,然后返回null

答案 1 :(得分:1)

我认为这里更好的解决方案是使用常规HTTP过滤器来检查条件并将请求转发到&#34; normal&#34;流程或HTML页面。

这允许您解耦逻辑。可能在将来你会收到另一个要求,即转发请求到另一条路径。您可以在另一个过滤器中实现此功能。

过滤器可以使用相同的Spring上下文,因此使用相同的bean,DB等。

EDIT。想想Spring拦截器。我个人没有使用过这种技术,但它也可以在这里提供帮助。