Java 如何使用SpringMVC3从控制器中的模型中获取对象?

Java 如何使用SpringMVC3从控制器中的模型中获取对象?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个控制器,其方法处理传入的GET数据,在模型中存储一些东西,然后重定向到处理这些对象的另一个页面 我似乎找不到任何好方法将存储在第一个方法中的对象从模型中取回以用于第二个方法。我该怎么做 这是控制器的顶部: @Controller @RequestMapping("/reviews") @SessionAttributes({"review", "externalReview"}) public class ReviewController { // [SNIP] } 下面是将我

我有一个控制器,其方法处理传入的
GET
数据,在
模型中存储一些东西,然后重定向到处理这些对象的另一个页面

我似乎找不到任何好方法将存储在第一个方法中的对象从模型中取回以用于第二个方法。我该怎么做

这是控制器的顶部:

@Controller
@RequestMapping("/reviews")
@SessionAttributes({"review", "externalReview"})
public class ReviewController {
    // [SNIP]
}
下面是将我要查找的对象添加到模型中的代码:

@RequestMapping(value="/new", params="UName", method=RequestMethod.GET)
public String newFormFromExternal(@ModelAttribute("externalReview") ExternalReview externalReview, Model model) throws IncompleteExternalException {
    // Convert the inbound external
    Review fromExternal = ExternalReviewUtil.reviewFromExternalReview(externalReview, externalDAO);

    // Add the externalReview to the session so we can look to see if we got a reviewee on the way in
    model.addAttribute("externalReview", externalReview);

    model.addAttribute("review", fromExternal);

    return "redirect:/reviews/newFromExternal";
}

目前,我只是获取模型的
映射
,通过它的键(字符串
名称)获取我想要的对象,然后将其转换为实际的对象(而不仅仅是
对象

代码如下:

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET)
public String newExternalForm(Model model) {
    // Get the review from the model
    Review review = (Review) model.asMap().get("review");

    /*** Do stuff with the review from the model ****/

    return "reviews/newFromPacs";
}

这种方法是可行的,但它看起来既简陋又笨重。这真的是唯一的方法吗?

一个可能的解决方案是使用
@modeldattribute
,尽管这很难看,因为您需要禁用该属性的数据绑定(为了安全):

你很幸运

如果您正在使用或能够更新到最新发布的Spring 3.1,则可以使用新范围的Flash变量


如果您不能使用3.1,您可能可以自己实现解决方案。本质上,您希望捕获重定向中需要存在的模型对象,将其放入会话中,并在检索到它后将其删除,以防止会话膨胀

@axtavt-是的,我编辑了这个问题以显示控制器类定义。不幸的是,禁用该属性上的数据绑定会变得非常难看,因为我需要让用户填写丢失的数据(这是第二个方法处理的),所以在以后的
POST
方法中绑定它是当前的流程。然而,这比我现在拥有的更干净(在某种程度上)。
@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(@ModelAttribute Review review) {
    ...
}

@InitBinder("review")
public void disableReviewBinding(WebDataBinder b) {
    b.setAllowedFields();
}