我有一个带有Web控制器方法的Spring 3.0应用程序。此方法通常在http响应中返回一个文件,因此我使用了返回类型org.springframework.http.HttpEntity
。但是现在有第二个要求:如果文件大于1MB并且在10点之后,则应显示HTML页面。
所以我的问题是,该方法有时应返回HttpEntity<byte[]>
,有时返回ModelAndView
。但是如何才能拥有这两种不同类型的返回类型?
(好的,要求不是10点,它要复杂得多,但关键是,这种干扰只能在控制器中进行。)
(此应用程序使用经典JSPX呈现HTML页面。)
答案 0 :(得分:7)
太容易了(抱歉问题):可以使用返回类型Object
定义方法,因此可以返回ModelAndView
或HttpEntity
的实例。
这是有效的,因为AnnotationMethodHandlerAdapter#getModelAndView
将返回值作为Object
,然后有一个带有很多inncstanceof
语句的if-then-else级联来确定concreate实例类型。
如果有人认为返回类型Object
太常见,那么可以定义自己的类(复合类),在两个不同的字段中包含ModelAndView
或HttpEntity
。然后必须编写自定义ModelAndViewResolver
。
此自定义ModelAndViewResolver
采用复合对象和
ModelAndView
还是webRequest
那样更新AnnotationMethodHandlerAdapter#handleHttpEntityResponse
,然后返回null 答案 1 :(得分:1)
我认为这里更好的解决方案是使用常规HTTP过滤器来检查条件并将请求转发到&#34; normal&#34;流程或HTML页面。
这允许您解耦逻辑。可能在将来你会收到另一个要求,即转发请求到另一条路径。您可以在另一个过滤器中实现此功能。
过滤器可以使用相同的Spring上下文,因此使用相同的bean,DB等。
EDIT。想想Spring拦截器。我个人没有使用过这种技术,但它也可以在这里提供帮助。