sidlejinks
sidlejinks

Reputation: 709

@RequestParam custom object

I use Spring MVC 3.1 in my app. Say I have a methods in controller as follows:

@RequestMapping(value = "/assignUser", method = RequestMethod.GET)
public String assignUserToCompany(ModelMap map){
    List<CompanyDetails> companies = //companies list from DAO
    List<UserDetails> users = //users list from DAO
    map.addAttribute("companiesList",companies);
    map.addAttribute("usersList",users);
    return "someView";
}

@RequestMapping(value = "/assignUser", method = RequestMethod.POST)
    public String assignUserToCompany(@RequestParam("user")UserDetails user,
                                      @RequestParam("company")CompanyDetails company){

    if(user!=null && company!=null){
      // some operations with entities
    }

    return "someView";
    }

and I have a form on the view side:

<form method="post" action="assignUser.html">
        <label for="select-users"><spring:message code="assignUser.label.users"/> </label>
        <select id="select-users" name="user">
            <c:forEach items="${usersList}" var="user">
                <option value="${user}">${user.firstName} ${user.legalName}</option>
            </c:forEach>
        </select>
        <label for="select-companies"><spring:message code="assignUser.label.companies"/> </label>
        <select id="select-companies" name="company">
            <c:forEach items="${companiesList}" var="company">
                <option value="${company}">${company.name}</option>
            </c:forEach>
        </select>
        <input type="submit" value="<spring:message code="assignUser.label.submit"/>"/>
    </form>

I want to pass object I select in input as request parameters and perform some operations with them but standart @RequestParam permit me only primitive types and wrappers as we know. Can I customize this in order to pass my objects? Thank you.

Upvotes: 3

Views: 8173

Answers (1)

NimChimpsky
NimChimpsky

Reputation: 47280

If the pojo relates directly to a form,decalre a spring form in your jsp (assuming yourDTO has a property name...

 <form:form id="yourForm" commandName="yourDTO" action="Save" method="POST">
 <form:input path="name" maxlength="90" cssStyle="width: 650px;" id="name"/>

and your controller :

@RequestMapping(value = "/Save", method = RequestMethod.POST)
public ModelAndView save(final yourDTO yourDTO) {

Or if converting one field to a complex class you will have to provide a conversion service :

@Component
public class FooConverter implements Converter<String, Foo> {
    @Override public Foo convert(String source) {
        //do covnersion from string to Foo
        Foo foo = new Foo(source)
        return Foo;
    }
}

and register it

<bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.yourcompany.controller.converters.FooConverter"/>
            </set>
        </property>
    </bean>

Upvotes: 4

Related Questions