@RequestParam имеет значение null при доступе в методе @ModelAttribute - PullRequest
0 голосов
/ 01 июня 2011

Я работаю над проектом, в котором пользователи могут выбрать, начинать ли с новой отправки формы или продолжить с отправкой формы, которую они начали ранее.Я использую нотацию @ModelAttribute для создания нового объекта для новых отправлений формы.Это прекрасно работает.Теперь я пытаюсь получить информацию из базы данных для предварительного заполнения информации в объекте на основе заданного идентификатора, и я столкнулся с загадкой.Я пытаюсь использовать @RequestParam для получения идентификатора, который передается с помощью отправки формы, но идентификатор возвращается ноль.Я вижу, что идентификатор отправляется как часть строки запроса, но он не попадает в метод @ModelAttribute.Вот что у меня есть.

Форма, которая отправляется для отправки regId, чтобы ее можно было предварительно заполнить

<form id="preregistration" action="/Homepage/Pre-Registration" method="post">
<input type="text" name="view" id="view" value="preprocess"/>
<select name="regId" id="regId">
    <option value="0">Select</option>
    <option value="1234">1234</option>
    <option value="4567">4567</option>
</select>
<input type="submit" name="submit" id="submit" value="Submit"/>
</form>    

Метод атрибута модели

@ModelAttribute("event")
public Event createDefaultEvent(@RequestParam(required = false) Integer regId){
    log.debug("regId: {}", regId);
    if (regId == null){
        log.debug("make new event object");
        return new Event();
    } else {
        log.debug("retrieve event with id: {}", regId);
        return eventDao.get(regId);
    }
}    

Метод сопоставления запросов

@RequestMapping(params = "view=preprocess")
public String getPreProcessInformation(@ModelAttribute("event") Event event)
    throws Exception{
        return "redirect:/preregistration.do?"+Page.EVENT.getView();
}

Может кто-нибудь помочь мне выяснить, почему мой regId равен нулю в методе @ModelAttruibute при отправке формы?Заранее спасибо!

1 Ответ

3 голосов
/ 01 июня 2011

Вы должны сказать ему, как называется название параметра, в котором вы хотите прочитать:

@RequestParam(value="regId", required = false)

То, что имена параметров метода не доступны для отражения во время выполнения. Spring не может понять, что вы назвали свой параметр 'regId' в Java-коде, вы должны сказать это так.

Редактировать:

Кроме того, некоторые более академические бессмысленные методы ModelAttribute лучше всего использовать для предоставления справочных данных, которые зафиксированы в области создаваемого вами представления. Транзакционные элементы, с которыми вы планируете связать поля формы, обычно должны генерироваться фактическими методами обработчика запросов. Это становится особенно важным, если вы используете фильтр OpenSession / EntityManagerInView и / или аннотацию @SessionAttributes.

...