How do you handle custom query parameters in Spring MVC?

Table of Contents

Introduction

In web applications, query parameters are often used to pass additional information in the URL. For example, http://example.com/products?category=electronics&price=100-500 uses query parameters to filter products based on category and price. Spring MVC provides a simple and efficient way to handle these custom query parameters in the controller layer.

This guide explores how to handle custom query parameters in Spring MVC, using **@RequestParam**, custom validation, and how to manage complex query parameters in Spring Boot.

Handling Custom Query Parameters with @RequestParam

The most common way to handle query parameters in Spring MVC is through the **@RequestParam** annotation. This annotation allows you to extract query parameters from the URL and use them directly in controller methods.

Basic Example: Handling Simple Query Parameters

Let’s start with a simple example where we extract custom query parameters like category and price from a URL.

URL Example:

In this example, the @RequestParam annotation binds the query parameters (category and price) to the method parameters in the controller. The values are automatically extracted from the request URL and passed to the getProducts() method.

Optional Query Parameters

If you want to make query parameters optional, you can specify a default value or set the parameter to be nullable.

Here, if the user does not pass the category or price query parameters, they will default to "all" and 0, respectively.

Alternatively, you can use required = false if the parameter is not mandatory.

Using Custom Query Parameters with Complex Objects

If the query parameters are more complex, you can bind them to a custom object. This is useful when dealing with multiple parameters that represent a more complex structure.

Example: Using a DTO for Custom Query Parameters

Consider a scenario where you want to filter products by multiple criteria, such as category, priceRange, and availabilityStatus. Instead of extracting each parameter individually, you can create a custom class to hold these parameters.

Then, in your controller, you can use the @RequestParam annotation to map these parameters directly to the ProductFilter object.

URL Example:

Spring MVC will automatically bind the query parameters to the properties of the ProductFilter object.

Custom Validation for Query Parameters

Sometimes, the query parameters might need validation to ensure they conform to expected formats or constraints. Spring provides JSR-303/JSR-380 validation annotations, which can be used along with Spring Validation to validate custom query parameters.

Example: Validating Custom Query Parameters

In the controller, you can validate the parameters by using the @Valid annotation:

You also need to add the @Validated annotation to the controller class to enable validation.

Handling Complex Query Parameters

In some cases, query parameters can be more complex (e.g., arrays, lists, or nested objects). Spring MVC supports the handling of complex query parameters as well.

Example: Handling Multiple Values for a Single Query Parameter

You can handle cases where a query parameter appears multiple times in the URL (e.g., ?category=electronics&category=appliances) by binding it to a list or array.

URL Example:

In this example, Spring automatically binds all values of the category query parameter into a List<String>.

Handling JSON or Nested Parameters

If you need to pass a complex object as a query parameter (e.g., a JSON string or nested parameters), Spring MVC does not automatically bind these into Java objects. However, you can use **@RequestParam** to pass a JSON string and then manually deserialize it in the controller method.

URL Example:

Here, you manually handle the deserialization of the filterJson query parameter into the ProductFilter object.

Conclusion

Handling custom query parameters in Spring MVC is straightforward with the use of **@RequestParam**. You can easily extract parameters from the URL and bind them to method parameters or custom objects in your controller. This flexibility allows you to build dynamic and customizable endpoints that can adapt to various query conditions.

For more advanced cases, such as complex objects, validation, or handling multiple values, Spring provides several mechanisms, including Java Bean Validation, lists/arrays binding, and manual deserialization. By understanding these techniques, you can effectively manage custom query parameters in Spring Boot applications.

Similar Questions