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

Diferença entre RequestMapping e GetMapping

Olá!

No curso de Spring MVC aprendi que posso utilizar a anotação acima do método da seguinte maneira:

@GetMapping("/hello")
public String olaMundo() { 
    return "Hello"; 
}

Entretanto neste curso aprendi a usar a anotação Request Mapping como parâmetro para o endereçamento.

@RequestMapping("/hello")
public class HelloController {

    @GetMapping
    public String olaMundo() {
        return "Hello World!";
    }

}

Qual a diferença entre as duas?

3 respostas
solução!

Olá! Tudo bem? A diferença é que a anotação RequestMapping é mais genérica e também mais customizável, normalmente usamos a RequestMapping nas classes controllers porque assim todos os métodos herdam o endereço do controller, assim evitando algumas repetições, por exemplo:

@RequestMapping
public class HelloController {

    @GetMapping("/hello")
    public String olaMundo() {
        return "Hello World!";
    }
    
    @GetMapping("/hello/bye")
    public String olaMundo() {
        return "Bye World!";
    }
    
}

A classe acima seria a mesma coisa que esta:

@RequestMapping("/hello")
public class HelloController {

    @GetMapping
    public String olaMundo() {
        return "Hello World!";
    }
    
    @GetMapping("/bye")
    public String olaMundo() {
        return "Bye World!";
    }
}

Essa opção ajuda a diminuir a repetição de código. Outra diferença entre o RequestMapping e o GetMapping é que o RequestMapping permite vários métodos Http ao mesmo tempo, por exemplo:

@RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.DELETE})
public String olaMundo() {
    return "Hello World!";
}

Isso pode ser útil se você quiser reutilizar a lógica de um método em outro, por exemplo aceitar tanto o método POST e PUT com a mesma lógica. Uma curiosidade é que tanto o @RequestMapping quanto suas variações (@GetMapping, @PostMapping, etc) aceitam mais de uma rota, por exemplo:

@RequestMapping(path = {"/hello", "/hi", "/ola", "/oi"})
public class HelloController {

    @GetMapping
    public String olaMundo() {
        return "Hello World!";
    }
}

Resumindo, o @RequestMapping é genérico e vale para quantos métodos HTTP você quiser, enquanto o @GetMapping só vale para requisições GET, @PostMapping só para requisições POST e assim em diante. Espero ter ajudado!

Caso queira aprender mais sobre HTTP, tem esse curso aqui da Alura: https://cursos.alura.com.br/course/http-entendendo-web-por-baixo-dos-panos

Neste último exemplo, onde identificou que é possível configurar diversas rotas no RequestMapping ! Se eu configurar diversas rotas num método @GetMapping ("/rota1/{codigo1}", "/rota2/{codigo2}" ) como eu posso identificar por qual rota o método foi acessado?

Estou questionando isso, pois possuo um método que acessa arquivos, e a única diferença entre eles é apenas uma letra na pesquisa dos mesmos, onde se o método é acessado pela rota "rota1" eu uso o tipo "A" e se acessado pela rota2 eu uso o tipo "B" a ser pesquisado!

Olá! Tudo bem? Se você precisar fazer isso você pode usar a classe HttpServletRequest do Spring, é só passar um parâmetro desse tipo no método do Controller. Um dos métodos dessa classe é o getRequestURI, que retorna uma string com o caminho da URL, veja alguns exemplos:

@RestController
@RequestMapping(path = {"/hello", "/hi", "/ola", "/oi"})
public class HelloController {
    @GetMapping
    public String olaMundo(HttpServletRequest request) {
        String uri = request.getRequestURI().replace("/", "");
        return "%s World!".formatted(uri);
    }

    @GetMapping("/{nome}")
    public String olaNome(HttpServletRequest request) {
        // Separa os caminhos da URL pela /
        var params = Arrays.stream(request.getRequestURI().split("/")).toList();
        return "%s %s!".formatted(params.get(1), params.get(2));
    }
}

Uma requisição para http://localhost:8080/hello vai retornar "hello World!" e uma para /hi retornará "hi World!", enquanto uma requisição para http://localhost:8080/hello/breno vai retornar "hello breno", já uma para /oi/Antonio vai retornar "oi Antonio". Outra forma de fazer isso seria usando a anotação @PathVariable do Spring, que vai dizer que uma variável vai ser passada pelo caminho da URL, o método ficaria assim:

@GetMapping("/{nome}")
public String olaNome(HttpServletRequest request, @PathVariable String nome) {
        var params = Arrays.stream(request.getRequestURI().split("/")).toList();
        return "%s %s!".formatted(params.get(1), nome);
}