Spring: return @ResponseBody "ResponseEntity <Список <JSONObject>>"
В контроллере я создаю json-массив. Если я вернусь List<JSONObject>
, это нормально:
@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;
}
но мне нужно вернуть массив JSON и код состояния HTTP:
@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 видит ошибку в строке XXX:
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
Как я могу вернуть ответ json + http? Есть мой рабочий код для возврата одного json-объекта + код состояния http:
@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);
}
Ответы
Ответ 1
Теперь я возвращаю Object
. Я не знаю лучшего решения, но оно работает.
@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);
}
Ответ 2
Вместо
return new ResponseEntity<JSONObject>(entities, HttpStatus.OK);
попробовать
return new ResponseEntity<List<JSONObject>>(entities, HttpStatus.OK);
Ответ 3
Лично я предпочитаю менять подпись метода на:
public ResponseEntity<?>
Это дает преимущество, возможно, возвращая сообщение об ошибке как единый элемент для служб, которые, когда ok, возвращают список элементов.
При возврате я не использую какой-либо тип (который в этом случае не используется):
return new ResponseEntity<>(entities, HttpStatus.OK);