【问题标题】:Spring multiple return type for @RequestMapping@RequestMapping 的 Spring 多重返回类型
【发布时间】:2013-11-13 21:41:25
【问题描述】:

我的问题是关于 Spring MVC 的功能。

@RequestMapping("SOME_VALUE")
RETURN_TYPE NAME_OF_FUNCTION (PARAMS){
     STATEMENTS;
}

有没有一种方式让 RETURN_TYPE 依赖于语句?

例如:当用户点击一个链接时,如果某个条件为真,我希望用户下载一个文件(即返回一个字节[])但如果它为假,我想向用户显示一个网页带有可能的选项(即 ModelAndView 对象)。

现在我知道它可以简单地在页面中使用 javascript 实现,但回到我最初的问题,Spring MVC 中有没有一种方法可以为我们提供更好的处理?

【问题讨论】:

  • 只定义许多@RequestMapping处理方法。
  • 你能给我举个例子吗?我的理解是我可以有一个小的 java 脚本代码,我可以将请求委托给适当的映射。 IE 对于文件我会去 /files/ 而对于其他我会去 /pages/ ?这是你想说的吗?
  • 为什么不直接将返回类型设为Object
  • 不知道这是可能的。我会试一试,然后告诉你进展如何。
  • 一个方法不能有多种返回类型。话虽如此,有一些方法可以处理您所描述的内容。最好的方法很大程度上取决于情况的语义。例如,如果获取带有选项的页面是错误情况,那么异常处理可能是合适的。如果带有选项的网页可以被视为流程中的一个有条件的插页式步骤,那么我会使用更多的重定向方法。

标签: java spring spring-mvc


【解决方案1】:

Spring 3.2+(我不确定以前的版本)的工作方式如下。处理程序方法 @RequestMapping 已注释,通过反射调用,无论其返回类型如何。 Spring 接收它的返回值并调度一个注册的HandlerMethodReturnValueHandler 来处理返回值,如果它支持的话。

HandlerMethodReturnValueHandler 的类型很多,@ResponseBodyResponseEntityStringModelAndView 等,大部分都可以在 javadoc 中看到。

因此,一种丑陋的方法是将您的方法定义为

RequestMapping("SOME_VALUE")
public Object NAME_OF_FUNCTION (PARAMS){
    if (something) {
        return "a string";
    } else if (somethingElse) {
        return new ResponseEntity(new byte[] {1,2,3});
    } else 
        return new OtherType();
}

Spring 将使用supportsReturnType 为其返回true 的第一个HandlerMethodReturnValueHandler


在我看来,你不应该这样做。尽可能使条件为外部的,即来自请求。这样,您可以在@RequestMapping 中映射条件并拥有多个@RequestMapping 方法,每个可能的条件一个。

【讨论】:

  • 有什么理由不鼓励这样做?我正在尝试尽可能多地学习,因此欢迎提供更多详细信息。
  • @ThePlatypus 代码不容易阅读,也不容易维护。
【解决方案2】:

当您想要返回页面时,您可以简单地返回 String 并将其设置为 JSP 文件的名称(即“myjsppage”),或者将其设置为重定向(即“redirect:/mydownloadablefile”),而不是返回 Object你想开始下载。对于后一种情况,您还需要为“/mydownloadablefile” URL 添加另一个带有请求映射的控制器方法。

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2016-12-31
    • 2017-03-13
    • 2012-04-05
    • 2014-01-13
    相关资源
    最近更新 更多