Diferenças entre Controller e RestController
As anotações @Controller e @RestController no Spring Framework são usadas para
definir controladores, mas elas têm finalidades e comportamentos ligeiramente diferentes:
@Controller
1. Finalidade: Usada para indicar que uma classe é um controlador Spring MVC que
processa solicitações web e retorna vistas (views) como resposta.
2. Retorno de Vistas: Normalmente, métodos em uma classe anotada com
@Controller retornam o nome de uma view (geralmente um template Thymeleaf,
JSP, etc.) que será renderizada para o usuário.
3. Modelo e View: Utiliza um objeto Model ou ModelAndView para passar dados do
controlador para a view.
4. Anotação @ResponseBody: Para retornar dados diretamente no corpo da resposta
HTTP (como JSON ou XML), você precisa adicionar a anotação @ResponseBody
nos métodos do controlador.
Exemplo com @Controller
import [Link];
import [Link];
import [Link];
@Controller
public class HomeController {
@GetMapping("/home")
public String home(Model model) {
[Link]("message", "Bem-vindo ao Spring MVC!");
return "home"; // Retorna o nome do template Thymeleaf
"[Link]"
}
@GetMapping("/api/message")
@ResponseBody
public String apiMessage() {
return "Mensagem JSON"; // Retorna uma string diretamente
no corpo da resposta HTTP
}
}
@RestController
1. Finalidade: Usada para indicar que uma classe é um controlador Spring MVC que
processa solicitações web e retorna dados diretamente no corpo da resposta HTTP,
ideal para APIs REST.
2. Combinação de Anotações: @RestController é uma combinação de
@Controller e @ResponseBody. Todos os métodos em uma classe anotada com
@RestController retornam dados diretamente no corpo da resposta, sem
necessidade de adicionar @ResponseBody a cada método.
3. Dados JSON ou XML: Os métodos retornam objetos que são automaticamente
serializados para JSON ou XML, dependendo da configuração e dos cabeçalhos da
solicitação HTTP.
Exemplo com @RestController
import [Link];
import [Link];
@RestController
public class ApiController {
@GetMapping("/api/greeting")
public Greeting greeting() {
return new Greeting("Olá, mundo!"); // Retorna um objeto
Greeting que será serializado para JSON
}
}
class Greeting {
private String message;
public Greeting(String message) {
[Link] = message;
}
// Getter e Setter
public String getMessage() {
return message;
}
public void setMessage(String message) {
[Link] = message;
}
}
Resumo das Diferenças
Aspecto @Controller @RestController
Finalidade Processar solicitações web Processar solicitações web e
e retornar vistas retornar dados (API REST)
Retorno Nome de uma view Dados (JSON, XML, etc.)
Anotação Necessária para retornar Não é necessária (implicitamente
@ResponseBody dados diretamente adicionada)
Uso Comum Aplicações web que APIs REST
rendem HTML
Quando usar cada um?
● Use @Controller quando você estiver construindo uma aplicação web que precisa
renderizar páginas HTML para o usuário.
● Use @RestController quando você estiver construindo uma API REST que
retorna dados no formato JSON ou XML.
Essas anotações ajudam a separar a lógica de apresentação e a lógica de serviços web em
uma aplicação Spring, facilitando a construção de sistemas web modernos e escaláveis.