Diferença entre @PathVariable e @RequestParam do Spring MVC

Postado em por Wolmir Cezer Garbin em Spring Framework | 251 Visualizações
Última atualização em:

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.

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 temos vários post que partem de um url padrão e para diferenciar os posts utilizamos @PathVariable. Veja o exemplo:

http://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 parametro 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?

Qualquer dúvida deixe nos comentários.

Wolmir Cezer Garbin

Wolmir Cezer Garbin


Sou formado em Desenvolvimento de Sistemas para Internet pela faculdade Mater Dei e Pós graduado em Desenvolvimento de sistemas em Java pela UTFPR. Trabalho a mais de 9 anos com desenvolvimento em Java, Android e Web utilizando as principais tecnologias do mercado. Atuo como professor na faculdade Mater Dei, programador na Garbo Software e criador do Receitas de Código.

Ver mais

Posts relacionados


Code Conference

Esta é uma conferência de código realizada na cidade de Pato Branco para dissiminar tendências e informações sobre programação e novas tecnológias

Veja mais sobre o Code Conference

Publique seu post no Receitas de Código

Agora você pode publicar seu post no Receitas de Código e compartilhar seu conhecimento com muitas pessoas!

Quero publicar