Spring: return @ResponseBody "ResponseEntity<List<JSONObject>>"

160,740

Solution 1

Now I return Object. I don't know better solution, but it works.

@RequestMapping(value="", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ResponseEntity<Object> getAll() {
    List<Entity> entityList = entityManager.findAll();

    List<JSONObject> entities = new ArrayList<JSONObject>();
    for (Entity n : entityList) {
        JSONObject Entity = new JSONObject();
        entity.put("id", n.getId());
        entity.put("address", n.getAddress());
        entities.add(entity);
    }
    return new ResponseEntity<Object>(entities, HttpStatus.OK);
}

Solution 2

Instead of

return new ResponseEntity<JSONObject>(entities, HttpStatus.OK);

try

return new ResponseEntity<List<JSONObject>>(entities, HttpStatus.OK);

Solution 3

Personally, I prefer changing the method signature to:

public ResponseEntity<?>

This gives the advantage of possibly returning an error message as single item for services which, when ok, return a list of items.

When returning I don't use any type (which is unused in this case anyway):

return new ResponseEntity<>(entities, HttpStatus.OK);
Share:
160,740
martin
Author by

martin

Updated on May 01, 2020

Comments

  • martin
    martin almost 4 years

    In controller I create json array. If I return List<JSONObject> it is ok:

    @RequestMapping(value="", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody List<JSONObject> getAll() {
        List<Entity> entityList = entityManager.findAll();
    
        List<JSONObject> entities = new ArrayList<JSONObject>();
        for (Entity n : entityList) {
            JSONObject entity = new JSONObject();
            entity.put("id", n.getId());
            entity.put("address", n.getAddress());
            entities.add(entity);
        }
        return entities;
    }
    

    but I need to return JSON array and HTTP status code:

    @RequestMapping(value="", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody ResponseEntity<List<JSONObject>> getAll() {
        List<Entity> entityList = entityManager.findAll();
    
        List<JSONObject> entities = new ArrayList<JSONObject>();
        for (Entity n : entityList) {
            JSONObject Entity = new JSONObject();
            entity.put("id", n.getId());
            entity.put("address", n.getAddress());
            entities.add(entity);
        }
        return new ResponseEntity<JSONObject>(entities, HttpStatus.OK); // XXX
    }
    

    Eclipse see error in XXX line:

    Multiple markers at this line
        - The constructor ResponseEntity<JSONObject>(List<JSONObject>, HttpStatus) is undefined
        - Type mismatch: cannot convert from ResponseEntity<JSONObject> to 
         ResponseEntity<List<JSONObject>>
        - Type mismatch: cannot convert from ResponseEntity<JSONObject> to JSONObject
    

    How can I return json+http reply? There is my working code for returning one json object + http status code:

    @RequestMapping(value="/{address}", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody ResponseEntity<JSONObject> getEntity(@PathVariable("address") int address) {
        Entity n = entityManager.findByAddress(address);
        JSONObject o = new JSONObject();
        o.put("id", n.getId());
        o.put("address", n.getAddress());
        return new ResponseEntity<JSONObject>(o, HttpStatus.OK);
    }
    
  • martin
    martin over 9 years
    Other solution is use stackoverflow.com/a/17539455/1974494 @ResponseStatus and @ExceptionHandler.
  • Acewin
    Acewin over 7 years
    ResponseEntity<Object> works for an obvious reason, because Object is parent class for everything
  • swaps
    swaps almost 7 years
    I tried the same (return new ResponseEntity<Object>(entities, HttpStatus.OK);)but the controller returning empty array for me. Any suggestions please
  • Kevin McCann
    Kevin McCann over 2 years
    I don't see any reference to a service or role in the original question, and besides, how would you get each JSONObjects role without iterating through the list of JSONObjects?