Spring MVC @RequestParam a list of objects

40,490

Solution 1

Request parameters are a Multimap of String to String. You cannot pass a complex object as request param.

But if you just pass the username that should work - see how to capture multiple parameters using @RequestParam using spring mvc?

@RequestParam("users") List<String> list

But I think it would be better to just use the request body to pass information.

Solution 2

Spring mvc can support List<Object>, Set<Object> and Map<Object> param, but without @RequestParam.

Take List<Object> as example, if your object is User.java, and it like this:

public class User {
    private String name;
    private int age;

    // getter and setter
}

And you want pass a param of List<User>, you can use url like this

http://127.0.0.1:8080/list?users[0].name=Alice&users[0].age=26&users[1].name=Bob&users[1].age=16

Remember to encode the url, the url after encoded is like this:

http://127.0.0.1:8080/list?users%5B0%5D.name=Alice&users%5B0%5D.age=26&users%5B1%5D.name=Bob&users%5B1%5D.age=16

Example of List<Object>, Set<Object> and Map<Object> is displayed in my github.

Share:
40,490
Kingamere
Author by

Kingamere

Updated on April 25, 2020

Comments

  • Kingamere
    Kingamere about 4 years

    I want to create a page where a person sees a list of users and there are check boxes next to each of them that the person can click to have them deleted.

    In my MVC that consumes a REST API, I want to send a List of User objects to the REST API.

    Can the @RequestParam annotation support that?

    For example:

    @RequestMapping(method = RequestMethod.DELETE, value = "/delete")
        public @ResponseBody Integer delete(
                @RequestParam("users") List<Users> list) {
            Integer deleteCount = 0;
            for (User u : list) {
                if (u != null) {
                    repo.delete(u);
                    ++deleteCount;
                }
            }
            return deleteCount;
        }
    

    In the MVC client, the url would be:

    List list = new ArrayList<User>();
    ....
    String url = "http://restapi/delete?users=" + list;
    
  • Kingamere
    Kingamere over 8 years
    Ahh, yes @RequestBody offers the functionality that I am looking for.
  • TheJeff
    TheJeff about 3 years
    @RequestBody is not allowed on a GET for Restful APIs. This will cause problems with openapi libs like springdoc
  • xagaffar
    xagaffar almost 3 years
    FYI for anyone else confused like me. Using List<User> as parameter for the Controller won't work. Instead a wrapper class containing list should be used a parameter. Check the github link!