Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Serialização automática de lista de JSONs

Olá.

Sei que por padrão o Spring responde com JSON. Eu tenho, atualmente, esse metódo na minha camada controller:

    public List<ResponseList> listar(String tokenApp) throws IOException {
        MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
        body.add("keyword", "");
        body.add("filter", "all");
        ResponseEntity responseEntity = requester.doRequest(tokenApp, Constants.URL, HttpMethod.POST, body);
        return Arrays.asList(new ObjectMapper().readValue(responseEntity.getBody().toString(), ResponseList[].class));
    }

Ele me retorna uma Lista de objetos JSONs do tipo ResponseList. Todavia, gostaria de saber se é possivel eliminar a lógica do return, uma vez que por padrão eu gostaria de devolver a lista já como JSON. Resumindo, a dúvida é se tem como automatizar o Arrays.asList(new ObjectMapper().readValue(responseEntity.getBody().toString(), ResponseList[].class)) com o Spring.

Meu controller também devolve uma List<ResponseList>.

Abraços!

4 respostas

Olá Leonardo!

Pelo que pesquisei para retornar uma lista JSON você poderia tentar utilizar a anotação @ResponseBody no retorno do seu controller:

public @ResponseBody List<ResponseList> listar(...){...}

Veja se funciona pra ti!

Aguardo seu retorno!

Eu uso a anotação @RestController, que já engloba a anotação @ResponseBody.

Especificando mais, no Model eu pego um array de JSONs que recebo de uma outra API, de-serealizo ela para um array de objetos (pegando apenas as informações que quero) e quero retornar esse array. Mas queria achar um jeito de fazer isso sem implementar esse return grande, pq pelo visto o Spring consegue fazer isso pra mim (só não sei como! rs)

[]'s

solução!

Opa Leonardo, dei uma pesquisada e as soluções que achei usam esse ObjectMapper. Então provavelmente não há uma maneira automática.

Para que a lógica não fique no controller você poderia tentar abstrair ela para dentro do ResponseList, algo tipo assim:

public class ResponseList {
    public static List<ResponseList> converterToJSON(ResponseEntity re){
        return Arrays.asList(new ObjectMapper().readValue(re.getBody().toString(), ResponseList[].class));
    }
}

Ai no seu controller você faria:

...codigo omitido...

ResponseEntity responseEntity = requester.doRequest(tokenApp, Constants.URL, HttpMethod.POST, body);
return ResponseList.converterToJSON(responseEntity);

...codigo omitido...

Não sei se faz sentido pra ti mas foi numa maneira que pensei de tirar a lógica do return.

Espero que te ajude.

É o que faço, atualmente. Se não há solução, vai assim mesmo! rs

Uma pequena contribuição para fazer um parser genérico:

    public static <T> List<T> returnJsonAsList(ResponseEntity responseEntity, Class<T> anyClazz) {
        try {
            Class<T[]> arrayClass = (Class<T[]>) Class.forName("[L" + anyClazz.getName() + ";");
            return Arrays.asList(new ObjectMapper().readValue(responseEntity.getBody().toString(), arrayClass));
        } catch (IOException | ClassNotFoundException e) {
            logger.error("Error: " + e.getMessage());
            return null;
        }
    }