I did a lesson about Spring Boot
and it works perfectly. But what if I want to return a set of objects ? I tried doing this but it doesn’t work. How can I do it correctly ?
With one object (it works):
@RequestMapping("/greeting") public Greeting greeting(@RequestParam(value="name", defaultValue = "World") String name) { return new Greeting(counter.incrementAndGet(), String.format(template, name)); }
With many objects (it doesn’t work):
@RequestMapping(value = "/greeting", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody List<Greeting> greeting() { Greeting greeting1 = new Greeting(1, "One"); Greeting greeting2 = new Greeting(2, "Two"); List<Greeting> list = new ArrayList<>(); list.add(greeting1); list.add(greeting2); return list; }
Advertisement
Answer
If you compare your original method to your newly made one (with a List
), you’ll notice a few differences.
First of all, within the @RequestMapping
annotation you’re now using the properties consumes
and produces
. produces
is not a problem here, because you are producing a response that should be JSON. However you’re not consuming anything, so you should leave away the consumes
.
@RequestMapping(value = "/greeting", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody List<Greeting> greeting() { Greeting greeting1 = new Greeting(1, "One"); Greeting greeting2 = new Greeting(2, "Two"); List<Greeting> list = new ArrayList<>(); list.add(greeting1); list.add(greeting2); return list; }
As a sidenote, you might also notice that you used the @ResponseBody
annotation. Putting it here won’t cause any errors, but it is not necessary, because if you followed the Spring tutorial correctly, you should have annotated your controller with @RestController
and by doing that, you already tell Spring that it will use a response body.