Попытка использовать поле @RequestParam в форме Spring

Если у меня есть форма Spring следующим образом:

<c:url value="/user/profile?id=${user.id}" var="profileURL" />  
    <form:form action="${profileURL}" method = "get">                       
        <input type="submit" value="My profile">                           
    </form:form>   

Spring жалуется, что:

Your page request has caused a MissingServletRequestParameterException: Required String parameter 'id' is not present error:

Однако в методе контроллера присутствует параметр:

@RequestMapping(value = "/profile", method = RequestMethod.GET)
public String getProfile(@RequestParam("id") String id, Model model) {    

    User user = userService.get(Integer.parseInt(id));         
    model.addAttribute("user", user);
    return "profile";
}

Кто-нибудь может посоветовать, почему это?

Если я использую простое поле формы, например:

<input name="id" type="hidden" value="=${user.id}">  

Все хорошо. Но я предпочитаю использовать поле Spring, скрытое от необходимости.

Во время выполнения форма выглядит так:

<form id="command" action="/nameOfapplication/user/profile?id=3" method="get">                       
        <input type="submit" value="My profile">                           
    </form>   

Это вызывает следующие сообщения в stacktrace:

Запрос вашей страницы вызвал ошибку MissingServletRequestParameterException: Обязательный строковый параметр 'id' отсутствует:

org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue (RequestParamMethodArgumentResolver.java:255)


person Mr Gwent    schedule 17.06.2014    source источник
comment
Можете ли вы открыть сетевую консоль своего браузера и проверить, что отправлено в неудачном запросе? Также как выглядит атрибут действия при рендеринге?   -  person Sotirios Delimanolis    schedule 17.06.2014
comment
Я добавил некоторые детали. Форма отображается правильно.   -  person Mr Gwent    schedule 17.06.2014
comment
Ага, это просто то, как HTML определяет поведение запроса на получение из формы. Он очищает все, что находится после ? в action URL.   -  person Sotirios Delimanolis    schedule 17.06.2014
comment
Хорошо. Я не знал, что GET очистил любые параметры в строке запроса. Но можете ли вы вообще посоветовать использование скрытого весеннего поля в теле формы, т.е. Spring-эквивалента: ‹input name = id type = hidden value == $ {user.id}›?   -  person Mr Gwent    schedule 17.06.2014
comment
Есть <form:hidden>. Это то, что вы ищете?   -  person Sotirios Delimanolis    schedule 17.06.2014
comment
Я так думаю, но мне не удалось заставить его работать. Я пробовал такие вещи, как: ‹form: hidden path = id /›, но он отклоняется из-за того, что ни BindingResult, ни простой целевой объект для bean-компонента 'command' доступны в качестве атрибута запроса. id в этом контексте не является частью проверяемого компонента.   -  person Mr Gwent    schedule 17.06.2014
comment
Ага. Spring form обычно используется для создания форм из объектов модели (объектов поддержки форм), а не из простых параметров запроса. Если вы этого не делаете, нормально <input>.   -  person Sotirios Delimanolis    schedule 17.06.2014
comment
Это возможный недостаток Spring, потому что я хотел попробовать использовать валидатор по другому вопросу: stackoverflow.com/questions/24253556/, что похоже на то, где я пытаюсь проверить введенный идентификатор но до того, как он будет использоваться как атрибут bean.   -  person Mr Gwent    schedule 17.06.2014
comment
Вы можете обернуть id в объект IdHolder и проверить это ... Кажется чрезмерным. Тогда ваша форма будет поддерживаться объектом IdHolder.   -  person Sotirios Delimanolis    schedule 17.06.2014
comment
Я думал об этом, но мне нравится метод в его нынешнем виде, но да, он кажется чрезмерным.   -  person Mr Gwent    schedule 17.06.2014