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.

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Spring Framework - TUTORIAL

Ú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 valor default como sendo true;

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.


Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!