1. Overview

In this quick tutorial, we’ll explore the differences between Spring’s @RequestParam and @PathVariable annotations.

@RequestParam and @PathVariable can both be used to extract values from the request URI, but they are a bit different.

Further reading:

Validating RequestParams and PathVariables in Spring

Learn how to validate request parameters and path variables with Spring MVC

Spring's RequestBody and ResponseBody Annotations

Learn about the Spring @RequestBody and @ResponseBody annotations.

Using Spring @ResponseStatus to Set HTTP Status Code

Have a look at the @ResponseStatus annotation and how to use it to set the response status code.

2. Query Parameter vs URI Path

While @RequestParams extract values from the query string, @PathVariables extract values from the URI path:

public String getFooById(@PathVariable String id) {
    return "ID: " + id;

Then we can map based on the path:

ID: abc

And for @RequestParam, it will be:

public String getFooByIdUsingQueryParam(@RequestParam String id) {
    return "ID: " + id;

which would give us the same response, just a different URI:

ID: abc

3. Encoded vs Exact Value

Because @PathVariable is extracting values from the URI path, it’s not encoded. On the other hand, @RequestParam is encoded.

Using the previous example, ab+c will return as-is:

ID: ab+c

But for a @RequestParam request, the parameter is URL decoded:

ID: ab c

4. Optional Values

Both @RequestParam and @PathVariable can be optional.

We can make @PathVariable optional by using the required attribute starting with Spring 4.3.3:

@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"})
public String getFooByOptionalId(@PathVariable(required = false) String id){
    return "ID: " + id;

Then we can do either:

ID: abc


ID: null

For @RequestParam, we can also use the required attribute.

Note that we should be careful when making @PathVariable optional, to avoid conflicts in paths.

5. Conclusion

In this article, we learned the differences between @RequestParam and @PathVariable.

The full source code for the examples can be found over on GitHub.

Course – LS (cat=Spring)

Get started with Spring and Spring Boot, through the Learn Spring course:

res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.