Diferença entre @PathVariable e @RequestParam do Spring MVC
Neste post vou mostrar qual a diferença entre @PathVariable e @RequestParam do Spring Boot, se você tem dúvidas de como e quando usar veja este post.
Última atualização em: | 70671 Visualizações
O Spring MVC é um dos frameworks mais famosos para desenvolvimento web e uma dúvida para quem está iniciando é como e onde utilizar @PathVariable
e @RequestParam
.
Quanto usar @PathVariable
Em resumo, o @PathVariable
é utilizado quando o valor da variável é passada diretamente na URL, mas não como um parametro que você passa após o sinal de interrogação (?
) mas sim quando o valor faz parte da url
.
Aqui no Receitas de Código por exemplo, temos vários post que partem de uma url padrão e para diferenciar os posts utilizamos @PathVariable
. Veja o exemplo:
https://receitasdecodigo.com.br/spring-boot/arquivos-de-log-com-spring-boot
Nesta requisição o conteúdo que vem após a última barra (arquivos-de-log-com-spring-boot
) é a variável que determina qual post será mostrado. E no controller utilizando @PathVariable
podemos obter este valor e tratar a requisição.
@RequestMapping(value="/{categoria}/{post}", method=RequestMethod.GET)
public String post(@PathVariable("categoria") String categoria, @PathVariable("post") String post) {
// [...]
}
Quando usar @RequestParam
Por outro lado, podemos ter vários parametros passados por url
mas que não são parte da url em sí. Veja o exemplo:
http://.../contato?nome=Wolmir&email=wolm[...]
O parâmetro nome
e email
não são parte integrante da URL, por este motivo devem ser capturadas no controller utilizando @RequestParam
, indiferente do método (POST ou GET). Um exemplo de @RequestParam
pode ser visto abaixo:
@RequestMapping("/findByDescricao")
public List<MeuObjeto> findByDescricao(@RequestParam("descricao") String descricao) {
return service.findByDescricaoContaining(descricao);
}
E para chamar este método você precisaria passar as instruções por parâmetro na url
, veja:
http://.../findByDescricao?descricao=qualquer texto
Para este caso, obrigatóriamente você precisa passar o parâmetro descricao
caso contrario não será invocado o método já que existe alguns parâmetros no @RequestParam
que por default define o parâmetro como obrigatório, veja:
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
Note que o
required
tem o valordefault
como sendotrue
;
Para que não seja obrigatório poderiamos escrever assim:
@RequestMapping("/findByDescricao")
public List<MeuObjeto> findByDescricao(@RequestParam(value="descricao", required=false) String descricao) {
return service.findByDescricaoContaining(descricao);
}
Conseguiu entender a diferença entre os dois?
Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.