Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความสำคัญของ @JsonIdentityInfo annotation ใน Jackson (Java)

คำอธิบายประกอบ @JsonIdentityInfo ใช้เมื่ออ็อบเจ็กต์มีความสัมพันธ์ parent-child (หรือ bidirectional relationship) ใน Jackson library ใช้ระบุ object identity ระหว่าง serialization และ deserialization เพื่อป้องกัน infinite recursion และรักษา object reference

ObjectIdGenerators.PropertyGenerator เป็น abstract placeholder class สำหรับระบุว่า Object Identifier จะมาจาก POJO property

Syntax

@Target(value={ANNOTATION_TYPE, TYPE, FIELD, METHOD, PARAMETER})
@Retention(value=RUNTIME)
public @interface JsonIdentityInfo

ตัวอย่างการใช้งาน

import java.util.*;
import java.io.*;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonIdentityInfoTest {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User(115, "Raja", "Ramesh");
        Address address = new Address(125, "Madhapur", "Hyderabad", user);
        user.addAddress(address);
        
        String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(address);
        System.out.println(jsonString);
    }
}

// User class
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId")
class User {
    private int userId;
    private String firstName;
    private String lastName;
    private List<Address> addresses;
    
    public User(int userId, String firstName, String lastName) {
        this.userId = userId;
        this.firstName = firstName;
        this.lastName = lastName;
        this.addresses = new ArrayList<>();
    }
    
    // getters...
    public void addAddress(Address address) { addresses.add(address); }
}

// Address class
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId")
class Address {
    private int userId;
    private String city;
    private String street;
    private User user;
    
    public Address(int userId, String street, String city, User user) {
        this.userId = userId;
        this.street = street;
        this.city = city;
        this.user = user;
    }
    
    // getters...
}

ผลลัพธ์ (Output)

{
  "userId" : 125,
  "city" : "Hyderabad",
  "street" : "Madhapur",
  "user" : {
    "userId" : 115,
    "firstName" : "Raja",
    "lastName" : "Ramesh"
  }
}

คำอธิบาย

โดยไม่มี @JsonIdentityInfo การ serialize address ที่มี reference ไป user และ user ที่มี reference กลับไป address จะทำให้เกิด infinite recursion (loop ไม่มีที่สิ้นสุด) @JsonIdentityInfo ใช้ property "userId" เป็น identifier ทำให้ Jackson รู้จัก object ที่เคย serialize แล้ว และอ้างอิงด้วย id แทนการ serialize ซ้ำ

Generator Types อื่นๆ

  • ObjectIdGenerators.IntSequenceGenerator - ใช้ integer sequence เป็น ID
  • ObjectIdGenerators.UUIDGenerator - ใช้ UUID เป็น ID
  • ObjectIdGenerators.PropertyGenerator - ใช้ property ของ object เองเป็น ID (เหมาะกับ entity ที่มี ID แล้ว)

สรุป

@JsonIdentityInfo จำเป็นสำหรับการจัดการ bidirectional relationships ใน Jackson ป้องกัน infinite recursion และรักษา object identity ระหว่าง serialization/deserialization