2012-01-10 70 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拦截器。我个人没有使用这种技术,但它也可以在这里帮助。

相关问题