- Em geral, ambas as anotações fazem com que a classe seja gerenciada pelo contêiner Spring IOC
- @Controller herda de @Component e oferece funcionalidade adicional:
- @Controller é usado principalmente em classes controladoras do Spring MVC para tratar requisições web
- @Component é uma anotação genérica para qualquer classe gerenciada pelo contêiner Spring
- @Controller usa anotações como @RequestMapping para definir mapeamentos de endpoints
- O Spring MVC escaneia automaticamente classes com @Controller, enquanto @Component tem escopo mais amplo
Solução de problemas de rota
- Verificar erros nos caminhos e parâmetros
- Confirmar existência das anotações necessárias e escopo de varredura de pacotes
- Validar configurações de interceptadores
Uso de @RestController
- @RestController é uma anotação especial para serviços RESTful
- Combina @Controller e @ResponseBody, retornando dados diretamente no corpo da resposta HTTP
- Evita o uso de resolvedores de visão para retornos em formato JSON ou XML
- Endpoints RESTful usam @GetMapping, @PostMapping, etc.
@RequestBody
- Vincula o corpo da requisição HTTP a parâmetros de método
- Utilizado principalmente com POST e PUT para processar dados em JSON/XML
- @RequestParam é usado para parâmetros de consulta em requisições GET
Injeção de dependência com @Autowired vs @Resource
- @Autowired busca por tipo, usando @Qualifier para resolver ambiguidades
- @Resource buscá por nome
- Injeção via construtor é recomendada como prática mais segura
Exemplos de injeção
// Via constructor
private AutorizadorLogin autorizador;
@Autowired
public ConfiguradorWeb(AutorizadorLogin autorizador) {
this.autorizador = autorizador;
}
Escopo de variáveis com var e let
var tem escopo de função com hoisting
let tem escopo de bloco e não permite redeclaração
Implementação de interceptador
- Configurar padrões de interceptação e isenções
- Implementar lógica no método preHandle
- Recuperar dados de sessão para verificação de estado
Classe de interceptador
@Component
public class AutorizadorLogin implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
Usuario usuario = (Usuario) req.getSession().getAttribute("usuario");
if (usuario == null) {
res.sendRedirect(req.getContextPath() + "/perfil/solicitarLogin");
return false;
}
return true;
}
}
Classe de configuração
@Configuration
public class ConfiguradorWeb implements WebMvcConfigurer {
@Autowired
private AutorizadorLogin autorizador;
@Override
public void addInterceptors(InterceptorRegistry registro) {
registro.addInterceptor(autorizador)
.addPathPatterns("/**")
.excludePathPatterns("/perfil/login", "/perfil/solicitarLogin");
}
}