2010-06-15 72 views
3

我想要實現這樣的:春天 - SessionAttribute問題

@Controller 
@SessionAttributes("promotion") 
class PromotionController { 
    @RequestMapping("showPromo") 
    void showPromotionInfo(
     @RequestParam("promId") String promotionId, 
     @ModelAttribute Promotion promotion, Errors errors 
    ) { 
     promotion = Promotions.get(promotionId); 
     if (promotion == null || promotion.validates() == false) { 
      errors.reject("promotion.invalid"); 
     } 
     return "prom"; 
    }  
} 

的代碼是無效的,不會工作,並有一些壞的錯誤,但我不知道怎麼寫的更好。

當用戶訪問URL「showPromo?promId = 15」時,控制器應驗證促銷是否有效(過期/不存在/等)。如果它是有效的 - 它應該顯示它的信息並將促銷保存到模型和會話中。如果不是 - 它應該顯示一些關於促銷無效的錯誤。

問題是,我需要在會話中保存促銷(針對多個請求),並且不想使用直接會話管理。 Spring現在有可能嗎?或者我做錯了什麼?

您能否使用Spring 3爲我的問題提供最佳解決方案?

在此先感謝。

補充:

好吧,我想我會寫下來的問題點:當在會議上沒有對象,所以不能用@ModelAttribute拋出一個錯誤,如綁定

  1. 「在會話中找不到對象」。並且在任何地方都沒有「可選」參數。
  2. 我無法在參數中使用@ModelAttribute,因爲我正在覆蓋該促銷對象。正確的方法應該是model.addAttribute(「促銷」,促銷)。但我也需要有一種方法來提供錯誤,而且我看不到使用model.addAttribute提供它們的方法。

回答

1

除了skaffman的回答:您可以使用BindingResult.MODEL_KEY_PREFIXBindingResult s與手動添加的模型屬性相關聯。

Promotion promotion = .... 
modelMap.addAttribute("promotion", promotion); 
if (!promotion.validate()) { 
    BindingResult errors = new BeanPropertyBindingResult(promotion, "promotion"); 
    errors.reject("promotion.invalid"); 
    model.put(BindingResult.MODEL_KEY_PREFIX + "promotion", errors); 
} 

但是請注意,你不能用null對象BindingResult關聯,因此不能使用errors.reject時未發現促銷(如果你不添加某種空的推廣分爲模型在案件)。

+0

非常感謝。這正是我想知道的。然而,這段代碼看起來非常令人沮喪(我的意思是基於字符串的屬性名稱)......可以有更好的方法來做到這一點嗎? – bezmax 2010-06-15 12:23:38

0

promotion = Promotions.get(promotionId);

以上是您的代碼行。推廣(S)獲得(promotionId); //排除「s」我放在()... 這應該在一種情況下幫助你。

可以幫助您的另一件事是當您執行@ModelAttribute(「bindingVariable」)時。你應該在那裏放置一個在你的情況下將綁定到促銷促銷,

如果你有一個CHECK塊有....你應該有一個視圖,如果它失敗(應該處理一些如何)。 ..如果成功。據我所知,你對此沒有任何處理。