Classe @Controller + @RestController no Spring

Galera,

Um controller de spring pode ser @Controller mvc e @RestController ao mesmo tempo? Existe alguma forma de implementar na mesma classe as duas funcionalidades, mesmo que não seja com essas anotações? O código abaixo é uma tentativa que fiz com o guia no site do spring para ilustrar o que eu quero fazer. Ele não funciona, só responde como @RestController.

`@Controller
@RestController
public class GreetingController {
private static final String template = “Hello, %s!”;
private final AtomicLong counter = new AtomicLong();

@RequestMapping("/greeting")
public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
    model.addAttribute("name", name);
    return "greeting";
}

@RequestMapping("/greeting2")
public Greeting greeting2(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
    return new Greeting(counter.incrementAndGet(),
            String.format(template, name));    	
}

}`

Alguma ideia? Valeu!

Olá
A diferença;
@Controller: é usado para sinalizar que a classe é um MVC Controller do Spring.
@RestController: Esta anotação adiciona automaticamente a anotação @Controller e @ResponseBody e não faz nada além disso, e neste caso todo retorno do serviço será transformado para um JSON.

Porém no seu caso é mais indicado usar o @Controller caso vc redirecione para alguma view.
Se sua classe só provê serviços REST é indicado usar @RestController.

1 curtida

Opa!

obrigado pela resposta! Entendi o que você disse, acabei encontrando na documentação do Spring (RTFM!) algo parecido que me esclareceu. No meu caso, eu queria escrever somente uma classe Controller que tratasse tanto as requisições REST quanto as requisições web. Consegui resolver o problema com content negotiation: para cada valor possível do header “Accept”, eu tenho um método que retorna de acordo. Valeu!!!

Eu fiquei hoje o dia inteiro tentando abrir minha view com a annotation @ResController. kkkkkk
Obrigado pela resposta aí meu brother!