繁体   English   中英

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

[英]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定义方法,所以可以返回ModelAndViewHttpEntity实例。

之所以AnnotationMethodHandlerAdapter#getModelAndView是因为AnnotationMethodHandlerAdapter#getModelAndView将返回值作为一个Object ,然后使用if-then-else级联和许多inncstanceof语句来确定inncstanceof实例类型。


如果有人觉得返回类型Object太普通了,则可以定义自己的类(compound-class),witch在两个不同的字段中包含ModelAndViewHttpEntity 然后必须编写一个自定义ModelAndViewResolver

此自定义ModelAndViewResolver接受复合对象并

  • 返回模型并查看是否为ModelAndView的复合类或
  • AnnotationMethodHandlerAdapter#handleHttpEntityResponse一样更新webRequest ,然后返回null

我认为这里更好的解决方案是使用常规HTTP过滤器来检查条件,然后将请求转发到“正常”流或HTML页面。

这使您可以分离逻辑。 也许将来您会收到另一个将请求转发到另一个路径的要求。 您可以在另一个过滤器中实现它。

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

编辑。 也考虑一下Spring拦截器。 我个人没有使用过这种技术,但是它在这里也可以提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM