Spring - SessionAttribute问题

时间:2010-06-15 07:38:27

标签: java spring spring-mvc

我想实现这样的事情:

@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 3为我的问题提供最佳解决方案?

提前致谢。

添加了:

好的,我想我会记下问题点:

  1. 当会话中没有对象时,它不能与@ModelAttribute绑定,抛出类似“在会话中找不到对象”的错误。并且在任何地方都没有“可选”参数。
  2. 我不能在参数中使用@ModelAttribute,因为我正在覆盖该促销对象。正确的方法应该是model.addAttribute(“促销”,促销)。但我还需要一种方法来提供错误,我认为无法使用model.addAttribute提供它们。

2 个答案:

答案 0 :(得分:1)

除了skaffman的回答:您可以使用BindingResultBindingResult.MODEL_KEY_PREFIX与手动添加的模型属性相关联。

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);
}

但请注意,您无法将BindingResultnull对象相关联,因此在未找到促销时您无法使用errors.reject(如果您不添加某些内容)在那种情况下,那种空洞的晋升模式。)

答案 1 :(得分:0)

promotion = Promotions.get(promotionId);

以上是您的代码行。推广(S)获得(promotionId); //排除我放入()的“s”... 在一个案例中,这应该会帮助你。

另一件可以帮助你的事情是你做@ModelAttribute(“bindingVariable”)。您应该在那里放置一个与您的促销活动绑定的

如果你有一个CHECK块....你应该有一个视图去IF它失败(应该如何处理)......如果它成功。就我所见,你对此没有处理。