Spring Boot এবং Jackson একত্রে ব্যবহার করে RESTful API তৈরি করা অত্যন্ত সহজ এবং কার্যকর। Spring Boot ডিফল্টভাবে Jackson-কে JSON serialization এবং deserialization-এর জন্য ব্যবহার করে। নিচে Spring Boot এবং Jackson ব্যবহার করে API ডেভেলপমেন্টের ধাপগুলো আলোচনা করা হলো।
Spring Boot এবং Jackson: ইন্টিগ্রেশন ও ডিপেনডেন্সি
Spring Boot ডিফল্টভাবে Jackson-এর উপর নির্ভর করে JSON ডেটা প্রসেসিং পরিচালনা করে। Maven ব্যবহার করলে, নিচের ডিপেনডেন্সি যুক্ত করুন:
Maven ডিপেনডেন্সি:
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
Step 1: একটি Simple REST Controller তৈরি করুন
1. ডেটা মডেল তৈরি করুন
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
public class Product {
private int id;
@NotNull(message = "Name cannot be null")
@Size(min = 2, max = 100, message = "Name must be between 2 and 100 characters")
private String name;
@NotNull(message = "Price cannot be null")
private Double price;
// Getters and Setters
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Double getPrice() { return price; }
public void setPrice(Double price) { this.price = price; }
}
2. REST Controller তৈরি করুন
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/api/products")
public class ProductController {
private final List<Product> products = new ArrayList<>();
// Get All Products
@GetMapping
public ResponseEntity<List<Product>> getAllProducts() {
return ResponseEntity.ok(products);
}
// Add a New Product
@PostMapping
public ResponseEntity<Product> addProduct(@Validated @RequestBody Product product) {
product.setId(products.size() + 1);
products.add(product);
return ResponseEntity.ok(product);
}
// Get Product by ID
@GetMapping("/{id}")
public ResponseEntity<Product> getProductById(@PathVariable int id) {
return products.stream()
.filter(product -> product.getId() == id)
.findFirst()
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
}
Step 2: JSON Serialization এবং Deserialization
Spring Boot ডিফল্টভাবে Jackson ব্যবহার করে @RequestBody এবং @ResponseBody এর মাধ্যমে JSON ডেটা serialize এবং deserialize করে।
Step 3: Advanced Jackson Customization
1. @JsonProperty ব্যবহার করে কাস্টম ফিল্ড নাম
import com.fasterxml.jackson.annotation.JsonProperty;
public class Product {
private int id;
@JsonProperty("product_name")
private String name;
private Double price;
// Getters and Setters
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Double getPrice() { return price; }
public void setPrice(Double price) { this.price = price; }
}
2. @JsonIgnore দিয়ে ফিল্ড বাদ দেওয়া
import com.fasterxml.jackson.annotation.JsonIgnore;
public class Product {
private int id;
private String name;
@JsonIgnore
private Double price;
// Getters and Setters
}
3. Custom Serializer/Deserializer
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
public class Product {
private int id;
private String name;
@JsonSerialize(using = CustomPriceSerializer.class)
private Double price;
// Getters and Setters
}
class CustomPriceSerializer extends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("$" + value);
}
}
Step 4: Validation এবং Error Handling
1. Custom Error Message
Spring Boot স্বয়ংক্রিয়ভাবে validation error message প্রদান করে।
উদাহরণ:
@PostMapping
public ResponseEntity<Product> addProduct(@Validated @RequestBody Product product) {
product.setId(products.size() + 1);
products.add(product);
return ResponseEntity.ok(product);
}
2. Global Exception Handling
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage())
);
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
}
আউটপুট (Validation Error):
{
"name": "Name must be between 2 and 100 characters",
"price": "Price cannot be null"
}
Step 5: Nested Objects এবং Complex JSON Handling
Nested Object মডেল:
public class Order {
private int orderId;
@Validated
private Product product;
// Getters and Setters
}
Controller Method:
@PostMapping("/orders")
public ResponseEntity<Order> createOrder(@Validated @RequestBody Order order) {
order.setOrderId(1001);
return ResponseEntity.ok(order);
}
Spring Boot এবং Jackson-এর মাধ্যমে RESTful API ডেভেলপমেন্ট:
- Basic Features: JSON serialization/deserialization সহজে করা যায়।
- Advanced Customization: Custom annotations (
@JsonProperty,@JsonIgnore,@JsonSerialize) ব্যবহার করে। - Validation and Error Handling:
@Validatedএবং Global Exception Handler ব্যবহার করে ডেটা integrity নিশ্চিত করা যায়। - Nested Objects: Nested JSON ডেটা সহজেই হ্যান্ডল করা যায়।
Spring Boot এবং Jackson একত্রে ব্যবহার করলে API ডেভেলপমেন্ট দ্রুত, সহজ, এবং কার্যকর হয়।
Read more