Spring এর @RestController এবং @RequestBody এর সাথে Jackson Integration

Jackson এবং Spring Boot Integration - জ্যাকসন (Jackson) - Java Technologies

346

Spring Framework এবং Jackson লাইব্রেরি একত্রে কাজ করে JSON Serialization (Java Object থেকে JSON এ রূপান্তর) এবং Deserialization (JSON থেকে Java Object এ রূপান্তর) সহজ করতে। Spring এর @RestController এবং @RequestBody অ্যানোটেশন ব্যবহার করে Jackson স্বয়ংক্রিয়ভাবে JSON ডেটা এবং Java Object এর মধ্যে ম্যাপিং পরিচালনা করে।


Spring এবং Jackson Integration এর প্রধান বৈশিষ্ট্য

  1. @RequestBody: ইনকামিং JSON ডেটা Java Object এ রূপান্তর করে।
  2. @ResponseBody: Java Object কে JSON আউটপুটে রূপান্তর করে।
  3. Spring Boot এ Jackson ডিফল্টভাবে অন্তর্ভুক্ত থাকে।
  4. Custom Serialization/Deserialization সমর্থন।

প্রয়োজনীয় সেটআপ

Maven ডিপেনডেন্সি (Spring Boot এর জন্য):

Spring Boot Jackson ডিফল্টভাবে অন্তর্ভুক্ত করে। যদি আলাদাভাবে যোগ করতে হয়:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- সর্বশেষ ভার্সন -->
</dependency>

Step-by-Step উদাহরণ

১. একটি মডেল ক্লাস তৈরি করা

public class User {
    private String name;
    private int age;
    private String email;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

২. একটি @RestController তৈরি করা

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @PostMapping
    public String createUser(@RequestBody User user) {
        // JSON থেকে User object তৈরি হয়েছে
        return "User created: " + user.getName() + ", Age: " + user.getAge();
    }

    @GetMapping
    public User getUser() {
        // JSON আউটপুটে User object রিটার্ন হবে
        User user = new User();
        user.setName("Alice");
        user.setAge(25);
        user.setEmail("alice@example.com");
        return user;
    }
}

৩. API টেস্ট করা

POST API Call:
  • Request:

    {
      "name": "Bob",
      "age": 30,
      "email": "bob@example.com"
    }
    
  • Response:

    User created: Bob, Age: 30
    
GET API Call:
  • Response:

    {
      "name": "Alice",
      "age": 25,
      "email": "alice@example.com"
    }
    

Custom Serialization/Deserialization

Custom Serializer তৈরি করা

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class UserSerializer extends StdSerializer<User> {

    public UserSerializer() {
        this(null);
    }

    public UserSerializer(Class<User> t) {
        super(t);
    }

    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("fullName", user.getName());
        gen.writeNumberField("userAge", user.getAge());
        gen.writeEndObject();
    }
}

Custom Serializer সংযুক্ত করা

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@JsonSerialize(using = UserSerializer.class)
public class User {
    private String name;
    private int age;
    private String email;

    // Getters and Setters
}

Custom Serialization Output:

  • GET API Call:
{
  "fullName": "Alice",
  "userAge": 25
}

Custom Deserializer তৈরি করা

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class UserDeserializer extends JsonDeserializer<User> {

    @Override
    public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // JSON Parsing Logic
        return null; // Custom deserialization logic
    }
}

Spring Boot Configuration (Custom ObjectMapper)

Spring Boot এ একটি কাস্টম ObjectMapper সংজ্ঞায়িত করে কাস্টম Serialization/Deserialization সমর্থন যোগ করা যায়।

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // Custom configurations
        return mapper;
    }
}

Error Handling (Validation Integration)

Validation এবং 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 ValidationExceptionHandler {

    @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);
    }
}

  1. Spring এর @RestController এবং @RequestBody Jackson এর মাধ্যমে JSON ডেটা হ্যান্ডলিংকে সহজ করে।
  2. Custom Serializer/Deserializer ব্যবহার করে JSON ফরম্যাট সম্পূর্ণ নিয়ন্ত্রণ করা যায়।
  3. Spring Boot এ ডিফল্ট ObjectMapper কাস্টমাইজ করা যায়।
  4. Validation এবং Exception Handling REST API এর জন্য Jackson Integration আরও শক্তিশালী করে।
Content added By
Promotion

Are you sure to start over?

Loading...