Использование аннотации ModelAttrbute для отправки объекта из jsp в контроллер

Я использую Spring MVC 3.1.0 с jsp/jstl. Чтобы отправить объект моему контроллеру, я использую аннотацию ModelAttribute, и все работает нормально. Но когда я пытаюсь передать сложный объект моему контроллеру, его значение равно нулю. Это моя объектная модель:

UorgVO.java

public class UorgVO {

    private String nom;
    private String nomAbrege;
    private UorgVO refUniteOrganisParent;

    //getters&Setters..
}

и есть моя страница jsp:

<form:form method="post" action="saveUorg.html"  modelAttribute="uorg" >
    <table>
        <tr>
            <th>Nom</th>
            <th>Nom abregé</th>
            <th>Unité père</th>
        </tr>
        <tr>
            <td><input  type="text" path="nom" name="nom"/></td>
            <td><input  type="text" path="nomAbrege" name="nomAbrege"/></td>
            <td>
                <select id="refUniteOrganisParent"
                        name="refUniteOrganisParent"
                    path="refUniteOrganisParent">
                    <option  value="null"> --- </option> 
                    <c:forEach items="${listeuos}" var="uorgg" varStatus="status" >
                        <option value="${uorgg}">${uorgg} </option> 
                    </c:forEach>
                </select>
            </td>
        </tr>
    </table> 
    <input type="submit" value="Enregistrer uorg"/> 
</form:form>

И мой контроллер:

@RequestMapping(value ="/saveUorg", method = RequestMethod.POST)
public ModelAndView saveUorg(@ModelAttribute("uorg") UorgVO uorg,BindingResult result) {

    System.out.println("My foreign attribute is:" +uorg.getRefUniteOrganisParent());
    return new ModelAndView("uorg_recherche");  
}   

И напечатанное значение равно null, но представлены другие атрибуты моего объекта.

Заранее спасибо за помощь


person Mouhie    schedule 03.07.2013    source источник
comment
Не уверен в ответе, но похоже, что в вашем JSP есть синтаксическая ошибка - в строке <input type="submit" value="Enregistrer uorg" <BQ> вы не закрываете входной тег, а тег <BQ> выглядит так, как будто его там быть не должно.   -  person robjohncox    schedule 03.07.2013
comment
я удалил тег и все еще не работает.   -  person Mouhie    schedule 03.07.2013
comment
Используя Firebug или аналогичный, можете ли вы подтвердить, что ваш браузер определенно отправляет параметр refUniteOrganisParent=value при отправке? Кроме того, вы не сможете напрямую связать это значение с UorgVO, потому что передаваемое значение будет строкой. Вам нужно будет зарегистрировать PropertyEditor в контроллере, который преобразует переданную строку в UorgVO. См. этот пример   -  person Will Keeling    schedule 05.07.2013
comment
Да, я использовал конвертер для решения проблемы с ConversionServiceFactoryBean Service, ответ пишу в посте. Спасибо, Уилл Килинг.   -  person Mouhie    schedule 05.07.2013


Ответы (2)


Я решил проблему, я надеюсь, что это поможет другим пользователям, у которых такая же проблема. С помощью службы ConversionServiceFactoryBean. Во-первых, я использовал «form: select» и «form: input», вот мой новый код jsp:

<td><form:input  path="email" type="text"/></td> 
<td>
<form:select path="refUniteOrganisParent.id" items="${listeuos}" itemValue="id" itemLabel="nom"/>
</td>

Как вы можете видеть, я повторил попытку значения идентификатора выбранного элемента.

Во-вторых, я использовал этот конвертер:

public class UorgConverter implements Converter<Long, UorgVO>{

@Autowired  
private UorgService uo;

@Override
public UorgVO convert(Long id) {

   // actions dealing with the service, to retrieve Uorg object from the id sended by the jsp page

    return uorgItem;        
  }

}

После этого я настраиваю свой xml-файл, выполнив следующие действия:

<mvc:annotation-driven conversion-service="conversionService"/>

<bean id="conversionService" class="my.package.ConversionServiceFactoryBean">
<property name="converters">
    <list>
        <bean class="converter.package.location.UorgConverter"></bean>
        <!--List of my converters -->
    </list>
</property>
</bean>

Спасибо всем, кто участвует в этом посте, чтобы решить проблему.

Муи.

person Mouhie    schedule 05.07.2013

Если вы заходите на сайт с формой, вам следует прислать модель. Лучший способ - return new ModelAndView("site","uorg", new UorgVO()) с вашего контроллера, где method = GET.

person user902691    schedule 03.07.2013
comment
Это не отвечает на вопрос - person a better oliver; 03.07.2013
comment
@ user902691 о каком сайте и контроллере вы говорите? страница, которая ссылается на мою страницу формы?? - person Mouhie; 03.07.2013
comment
@mouhie Я говорю о сайте входа, где вы возвращаете View имя. - person user902691; 03.07.2013