2010-06-15 69 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块有....你应该有一个视图,如果它失败(应该处理一些如何)。 ..如果成功。据我所知,你对此没有任何处理。