web-dev-qa-db-ja.com

Spring:@ResponseBody "ResponseEntity <List <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返信を返すにはどうすればよいですか? 1つの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);
}
32
martin

ここで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);
}
21
martin

の代わりに

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

試してみる

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

個人的には、メソッドシグネチャを次のように変更することを好みます。

public ResponseEntity<?>

これは、サービスの単一のアイテムとしてエラーメッセージを返す可能性があるという利点を提供します。サービスは、OKの場合、アイテムのリストを返します。

返すとき、私はどのタイプも使用しません(この場合はとにかく使用されません):

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