2011-09-12 31 views
5

我有一个控制器,处理传入的GET数据,将一些东西存储在model中,然后重定向到处理这些对象的另一个页面。如何使用Spring MVC 3从控制器模型中获取对象?

我似乎无法找到任何好方法将第一个方法中存储的对象从模型中取出以在第二个方法中使用。我怎样才能做到这一点?

这里的控制器的顶部:

@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"; 
} 

回答

1

,我只是得到一个Map的该模型,通过它的关键字(String名称)获取我想要的对象,然后将其转换为实际的对象(而不仅仅是Object)。

下面的代码:

@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"; 
} 

这样的作品,但似乎哈克和笨重。这真的是唯一的方法吗?

+0

'review'在'@ SessionAttributes'中声明,对吧? – axtavt

+0

@axtavt - 是的,我编辑了问题以显示控制器类的定义。 – cdeszaq

1

一个可能的解决方案是使用@ModelAttribute,虽然这是相当丑陋,因为你需要禁用绑定该属性(安全):

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(@ModelAttribute Review review) { 
    ... 
} 

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

不幸的是,禁用该属性的数据绑定会变得非常难看,因为我需要用户填写缺失的数据(这是第二种方法处理的),所以在后面的POST方法中绑定它就是当前流。但是,这比我目前所拥有的更清洁(在某种程度上)。 – cdeszaq

相关问题