![](/img/trans.png)
[英]Spring Controller ModelAndView test MockMvc empty Response
[英]How to alternate the web controller response between HttpEntity and ModelAndView in Spring
我有一个带有Web控制器方法的Spring 3.0应用程序。 此方法通常在http响应中返回文件,因此我使用了返回类型org.springframework.http.HttpEntity
。 但是现在有第二个要求:如果文件大于1MB,并且在10点之后,则应显示HTML页面。
所以我的问题是,该方法有时应返回HttpEntity<byte[]>
,有时应返回ModelAndView
。 但是,如何有这两种不同的返回类型呢?
( 好吧,要求不是10点钟,它要复杂得多,但要点是,只能在控制器中进行此操作。 )
(此应用程序使用经典的JSPX来呈现分页的HTML。)
太容易了(很抱歉):可以用返回类型Object
定义方法,所以可以返回ModelAndView
或HttpEntity
实例。
之所以AnnotationMethodHandlerAdapter#getModelAndView
是因为AnnotationMethodHandlerAdapter#getModelAndView
将返回值作为一个Object
,然后使用if-then-else级联和许多inncstanceof
语句来确定inncstanceof
实例类型。
如果有人觉得返回类型Object
太普通了,则可以定义自己的类(compound-class),witch在两个不同的字段中包含ModelAndView
或HttpEntity
。 然后必须编写一个自定义ModelAndViewResolver
。
此自定义ModelAndViewResolver
接受复合对象并
ModelAndView
的复合类或 AnnotationMethodHandlerAdapter#handleHttpEntityResponse
一样更新webRequest
,然后返回null 我认为这里更好的解决方案是使用常规HTTP过滤器来检查条件,然后将请求转发到“正常”流或HTML页面。
这使您可以分离逻辑。 也许将来您会收到另一个将请求转发到另一个路径的要求。 您可以在另一个过滤器中实现它。
过滤器可以使用相同的Spring上下文,因此可以使用相同的bean,DB等。
编辑。 也考虑一下Spring拦截器。 我个人没有使用过这种技术,但是它在这里也可以提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.