Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

जावा में Jackson का उपयोग करके @JsonManagedReference और @JsonBackReference एनोटेशन कब उपयोग करें

@JsonManagedReference और @JsonBackReference एनोटेशन्स का उपयोग बाईडायरेक्शनल तरीके से JSON स्ट्रक्चर बनाने के लिए किया जा सकता है। @JsonManagedReference एनोटेशन एक फॉरवर्ड रेफरेंस है जो सीरियलाइजेशन प्रक्रिया के दौरान शामिल होता है जबकि @JsonBackReference एनोटेशन एक बैकरेफरेंस है जो सीरियलाइजेशन प्रक्रिया के दौरान छोड़ दिया जाता है।

उदाहरण

import java.util.*;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;

public class ManagedReferenceBackReferenceTest {
    public static void main(String args[]) throws JsonProcessingException {
        BackReferenceBeanTest testBean = new BackReferenceBeanTest(110, "Sai Chaitanya");
        ManagedReferenceBeanTest bean = new ManagedReferenceBeanTest(135, "Adithya Ram", testBean);
        testBean.addEmployees(bean);
        
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(bean);
        System.out.println(jsonString);
    }
}

class ManagedReferenceBeanTest {
    public int empId = 115;
    public String empName = "Raja Ramesh";
    
    @JsonManagedReference
    public BackReferenceBeanTest manager;
    
    public ManagedReferenceBeanTest(int empId, String empName, BackReferenceBeanTest manager) {
        this.empId = empId;
        this.empName = empName;
        this.manager = manager;
    }
}

class BackReferenceBeanTest {
    public int empId = 125;
    public String empName = "Jai Dev";
    
    @JsonBackReference
    public List<ManagedReferenceBeanTest> list;
    
    public BackReferenceBeanTest(int empId, String empName) {
        this.empId = empId;
        this.empName = empName;
        list = new ArrayList<>();
    }
    
    public void addEmployees(ManagedReferenceBeanTest managedReferenceBeanTest) {
        list.add(managedReferenceBeanTest);
    }
}

आउटपुट

{
  "empId" : 135,
  "empName" : "Adithya Ram",
  "manager" : {
    "empId" : 110,
    "empName" : "Sai Chaitanya"
  }
}

कैसे काम करता है

  • @JsonManagedReference: "फॉरवर्ड" साइड - सामान्य रूप से सीरियलाइज होता है
  • @JsonBackReference: "बैक" साइड - सीरियलाइजेशन के दौरान छोड़ दिया जाता है
  • पेयरिंग: दोनों एनोटेशन्स का एक ही लॉजिकल नाम होना चाहिए (डिफ़ॉल्ट रूप से प्रॉपर्टी नाम से निष्कर्षित)

एक्सप्लिसिट नाम के साथ

@JsonManagedReference("employee-manager")
public Manager manager;

@JsonBackReference("employee-manager")
public List<Employee> subordinates;

@JsonIdentityInfo के साथ तुलना

पहलू @ManagedReference/@BackReference @JsonIdentityInfo
एप्रोचएक साइड को छोड़ देता हैID रेफरेंस का उपयोग करता है
आउटपुटट्री स्ट्रक्चर (कोई डुप्लिकेशन नहीं)फर्स्ट ऑक्यूरेंस फुल, बाद में ID रेफरेंस
डीसीरियलाइजेशनबैक रेफरेंस रिस्टोर नहीं होताफुल ऑब्जेक्ट ग्राफ रिस्टोर होता है
जटिलतासरल (2 एनोटेशन्स)अधिक कॉन्फिगरेबल

कब किसका उपयोग करें

  • @ManagedReference/@BackReference: जब बैक रेफरेंस की आवश्यकता न हो, सरल पेरेंट-चाइल्ड, आउटपुट-ओनली सीरियलाइजेशन
  • @JsonIdentityInfo: जब फुल ऑब्जेक्ट ग्राफ रिस्टोरेशन चाहिए, कॉम्प्लेक्स सर्कुलर रेफरेंसेज, डीसीरियलाइजेशन भी आवश्यक हो

सीमाएं

  • बैक रेफरेंस डीसीरियलाइजेशन पर रिस्टोर नहीं होता (नल रहता है)
  • केवल डायरेक्ट पेरेंट-चाइल्ड के लिए काम करता है, कॉम्प्लेक्स ग्राफ्स के लिए नहीं
  • नाम मैन्युअली मैच करना पड़ता है कॉम्प्लेक्स केसेस में
  1. - Java में fillInStackTrace() मेथड का उपयोग कब करें?

    fillInStackTrace() जावा में Throwable क्लास का एक महत्वपूर्ण मेथड है। स्टैक ट्रेस यह निर्धारित करने के लिए उपयोगी हो सकता है कि अपवाद वास्तव में कहां फेंका गया है। कुछ स्थितियां हो सकती हैं जहां हमें एक अपवाद को फिर से फेंकने और यह पता लगाने की आवश्यकता होती है कि इसे कहां रीथ्रो किया गया, हम ऐसे पर

  1. - Java में एब्सट्रैक्ट क्लास कब उपयोग करें और इंटरफेस कब उपयोग करें?

    एक इंटरफेस का उपयोग कॉन्ट्रैक्ट बिहेवियर को परिभाषित करने के लिए किया जा सकता है और यह दो सिस्टम्स के बीच इंटरैक्ट करने के लिए कॉन्ट्रैक्ट के रूप में भी कार्य कर सकता है जबकि एक एब्सट्रैक्ट क्लास मुख्य रूप से सबक्लासेस के लिए डिफ़ॉल्ट बिहेवियर को परिभाषित करने के लिए उपयोग की जाती है, इसका अर्थ है

  1. - Java में एब्स्ट्रैक्ट मेथड और क्लासेस

    हां। हम Java में एब्स्ट्रैक्ट मेथड/क्लासेस बहुत आसानी से बना सकते हैं। उदाहरण एक एब्स्ट्रैक्ट क्लास बनाने के लिए, क्लास डिक्लेरेशन में class कीवर्ड से पहले abstract कीवर्ड का उपयोग करें। /* File name : Employee.java */ public abstract class Employee { private String name; private String a