Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Resposta Json do controller, @ResponseBody nao funciona

Boa tarde,

estou tentando fazer o meu Controller devolver um Json, para meu ajax, mas ele não está convertendo no formato correto eu acho.

Controller:

@Controller
@RequestMapping(value="/teste")
public class TesteController {

    /**
     * Construtor
     **/
    public TesteController (){
    }

  @RequestMapping(method = RequestMethod.GET)
  @ResponseBody
    public String TestedeRota(){
       return "ok";
    }
}

Dessa forma não funciona, mas se eu converto na mão ele funciona:

@Controller
@RequestMapping(value="/teste")
public class TesteController {

    /**
     * Construtor
     **/
    public TesteController (){
    }

  @RequestMapping(method = RequestMethod.GET)
  @ResponseBody
    public String TestedeRota(){
      JsonObject json = new JsonObject();
      json.addProperty("nome", "renata");
      return json.toString();
    }
}

Ajax:

app.controller('TesteController', ['$scope', '$http', '$location', '$rootScope', '$window', '$state', function ($scope, $http, $location, $rootScope, $window, $state) {

      $http({
        method: 'GET',
        url: "/teste",


      }).success(function(data){
        console.log(data);
      }).error(function(data){
        console.log("deu erro");
      });

    }]);

alguém sabe o que pode ser?

obrigado

6 respostas

Olá, Gabriel!

No seu primeiro exemplo, o valor retornado não é um JSON!

Um JSON precisa ser definido entre chaves ({}) e os nomes das propriedades precisam estar entre aspas duplas (").

O erro que você deve ter recebido no Console do Navegador (F12) foi:

SyntaxError: Unexpected token o in JSON at position 0

O AngularJS usa o método JSON.parse() por debaixo dos panos.

Se você fizer:

JSON.parse("ok");

receberá o mesmo erro!

Agora, se você retornasse um JSON bem formatado, aí funcionaria. Exemplo:

@RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public String TestedeRota() {
        return "{\"propriedade\": \"ok\"}";
    }

Uma coisa interessante do Spring MVC é que, se você tiver no Classpath uma biblioteca de serialização Java/JSON como a Jackson, o Spring converte os objetos automaticamente.

Exemplo:

@RequestMapping(method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public Produto buscaPorId(Integer id) {
        return dao.buscaPorId(id);
    }

No seu pom.xml, você precisa ter algo como:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.2</version>
</dependency>

Alexandre bom dia tudo bem ?

obrigado pela atenção nas respostas, mas estou com dúvida ainda, vou explicar, tenho 2 métodos retornando Json, um funciona e o outro nao.

O que funciona:

@RequestMapping(method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_UTF8_VALUE,
                    produces=MediaType.APPLICATION_JSON_UTF8_VALUE)

    public @ResponseBody User AdicionaUser(@RequestBody User user) {

        System.out.println(user);
        user.setName(user.getLogin());


        Udao.save(user);
        return user;
    }

o que não funciona:

@RequestMapping(method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_UTF8_VALUE,
                    produces=MediaType.APPLICATION_JSON_UTF8_VALUE)

    public @ResponseBody String sendEmail(@RequestBody String email){


      SimpleMailMessage message = new SimpleMailMessage();

      System.out.println(email);
      message.setText("Acesse esse link para renovação da sua senha");
        message.setTo(email);
        message.setFrom("gabriel26bartholo@gmail.com");
        sender.send(message);
        return "ok";
    }

eles são iguais, a única coisa que difere é o retorno, cheguei a conclusão, de que o Spring está formatando o objeto User mas a String não está?

Seria isso? e eu estou usando o jackson como dependência.

obrigado

solução

Opa, Gabriel!

É isso mesmo que você disse!

Por padrão, o Spring espera, no métodos @RequestMapping, que você retorne um String com o nome de uma JSP.

Porém, se colocarmos o @ResponseBody, o Spring vai enviar ao navegador literalmente o que é retornado no método.

Se é retornada uma String, é enviada essa String.

Se é retornado um objeto e não houver um Jackson da vida, tipo o seu User, é enviado o objeto serializado (binário).

Como você tem o Jackson, é enviado o objeto transformado em JSON.


Como no método sendEmail você retorna uma String com o valor "ok", isso é enviado para o navegador.

O AngularJS espera que venha um JSON bem formatado, não apenas uma String. Por isso acontece o erro no navegador!

Alexandre muito obrigado pela resposta e atenção ajudou muito.

Bacana, Gabriel!

Bons estudos!