2011-09-12 52 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

相關問題