Jackson-এর @JsonIdentityInfo অ্যানোটেশন একটি গুরুত্বপূর্ণ টুল, যা Object Identity হ্যান্ডেল করার জন্য ব্যবহৃত হয়। এটি বিশেষত Circular References বা Self-referencing অবজেক্টের ক্ষেত্রে গুরুত্বপূর্ণ। Object Identity এর মাধ্যমে, আপনি Jackson-কে বলতে পারেন যে একই অবজেক্টকে একাধিক স্থানে ব্যবহার করার সময়ে, এটি একটি unique identifier ব্যবহার করে সংরক্ষণ করবে, যা infinite recursion এড়াতে সাহায্য করে।
@JsonIdentityInfo কী?
Jackson এর @JsonIdentityInfo অ্যানোটেশন আপনাকে JSON এর মধ্যে object গুলোর identity সঠিকভাবে ট্র্যাক করতে সাহায্য করে। এর মাধ্যমে, object references কে unique id দিয়ে চিহ্নিত করা হয়, যাতে একই অবজেক্ট বারবার JSON এ serialize না হয়।
@JsonIdentityInfoএকটিObjectIdGeneratorsব্যবহার করে object গুলোর জন্য একটি ইউনিক আইডেন্টিফায়ার তৈরি করে।- এটি circular references বা bidirectional references সঠিকভাবে serialize করতে ব্যবহৃত হয়, যেখানে একটি অবজেক্ট অন্য একটি অবজেক্টকে রেফার করে এবং সেই অবজেক্ট আবার প্রথম অবজেক্টটিকে রেফার করে।
@JsonIdentityInfo ব্যবহার করার জন্য উদাহরণ
ধরা যাক আমাদের একটি Parent এবং Child ক্লাস রয়েছে, যেখানে bidirectional references রয়েছে।
1. Parent এবং Child ক্লাস তৈরি করুন:
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Parent {
private int id;
private String name;
private Child child;
// Constructors, Getters, and Setters
public Parent(int id, String name) {
this.id = id;
this.name = name;
}
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 Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Child {
private int id;
private String name;
private Parent parent;
// Constructors, Getters, and Setters
public Child(int id, String name) {
this.id = id;
this.name = name;
}
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 Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
2. Serialization Example:
এখন, আমরা Parent এবং Child অবজেক্ট তৈরি করব এবং Jackson ব্যবহার করে এগুলোকে JSON-এ serialize করব।
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectIdentityExample {
public static void main(String[] args) throws Exception {
Parent parent = new Parent(1, "Rahim");
Child child = new Child(2, "Rita");
parent.setChild(child);
child.setParent(parent);
// ObjectMapper initialization
ObjectMapper objectMapper = new ObjectMapper();
// Serialization
String json = objectMapper.writeValueAsString(parent);
System.out.println(json);
}
}
3. JSON Output:
{
"id": 1,
"name": "Rahim",
"child": {
"id": 2,
"name": "Rita",
"parent": 1
}
}
ব্যাখ্যা:
- এখানে
@JsonIdentityInfoব্যবহার করা হয়েছেParentএবংChildক্লাসের জন্য। এতেparentঅবজেক্টের মধ্যেchildঅবজেক্টের রেফারেন্স রয়েছে, এবংchildঅবজেক্টেও আবারparentঅবজেক্টের রেফারেন্স রয়েছে। - Jackson
@JsonIdentityInfoএর মাধ্যমেidফিল্ডটি ব্যবহার করেparentএবংchildঅবজেক্টগুলোর রেফারেন্স সঠিকভাবে ট্র্যাক করেছে এবং infinite recursion এড়ানো হয়েছে।
@JsonIdentityInfo এর বিভিন্ন Configuration
1. Object Identity-এ Custom ID Generator ব্যবহার:
Jackson ডিফল্টভাবে PropertyGenerator ব্যবহার করে object identity তৈরি করে, তবে আপনি কাস্টম ID Generator ব্যবহার করতে পারেন।
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id")
এটি int sequence অনুসারে object identity তৈরি করবে।
2. @JsonIdentityInfo এর সঙ্গে @JsonBackReference ব্যবহার:
Bidirectional Relationship এর জন্য, আপনি @JsonBackReference এবং @JsonManagedReference একসঙ্গে ব্যবহার করতে পারেন।
@JsonBackReference
private Parent parent;
@JsonManagedReference
private Child child;
এই অ্যানোটেশনগুলির সাহায্যে, আপনি সহজেই Circular Reference সমাধান করতে পারেন।
@JsonIdentityInfo এর সুবিধা
- Circular References সমাধান:
- যখন Parent এবং Child অবজেক্ট একে অপরকে রেফার করে, তখন এটি infinite recursion থেকে রক্ষা করে।
- Efficient Object Mapping:
- একই অবজেক্ট একাধিকবার JSON এ উপস্থিত হলে, তা unique identifier হিসেবে ব্যবহার করা হয়, যাতে একাধিক রেফারেন্সে একই অবজেক্টের তথ্য বারবার না আসে।
- Serialization এবং Deserialization এর জন্য Data Integrity:
- object identity ব্যবহার করে একই অবজেক্টের জন্য একাধিক reference manage করা যায় এবং সঠিকভাবে সেগুলোকে map করা যায়।
@JsonIdentityInfoঅ্যানোটেশন Jackson-এ Object Identity হ্যান্ডল করতে ব্যবহৃত হয় এবং Circular Reference সমস্যা সমাধান করে।- Bidirectional References (যেমন Parent-Child relationships) সঠিকভাবে handle করার জন্য এটি অত্যন্ত কার্যকর।
- Custom Object Identity তৈরি করার জন্য কাস্টম ID Generators ব্যবহার করা যেতে পারে।
- Jackson অ্যানোটেশনগুলি complex object mapping এর ক্ষেত্রে কার্যকর এবং infinite recursion বা Circular Reference এড়াতে সাহায্য করে।
Read more