Spring - проблема SessionAttribute - PullRequest
3 голосов
/ 15 июня 2010

Я хочу реализовать что-то вроде этого:

@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 ]

1 голос
/ 15 июня 2010

В дополнение к ответу Скаффмана: вы можете связать BindingResult с вручную добавленными атрибутами модели, используя BindingResult.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);
}

Обратите внимание, однако, что вы не можете связать BindingResult с null объектом, поэтому вы не можете использовать errors.reject, когда продвижение не было найдено (если вы не добавили какое-либо пустое продвижение в модель в этом случае).

0 голосов
/ 02 ноября 2014

продвижение = Promotions.get (promoId);

Над строкой кода.Продвижение (ы) .get (promotionId);// исключаем те "s", которые я поместил в () ... Это ДОЛЖНО помочь вам в одном случае.

Еще одна вещь, которая МОЖЕТ вам помочь, - это когда вы делаете свой @ModelAttribute ("bindingVariable").Вы должны разместить там один, который в вашем случае будет привязан к промо-акции,

Если у вас там есть блок CHECK .... Вы должны иметь возможность перейти к нему, если он потерпит неудачу (следует решить, как) ... И если это удастся.Насколько я могу судить, ты не справишься с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...