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

ความสำคัญของ @JsonFilter annotation ใน Java

คำอธิบายประกอบ @JsonFilter ใช้กำหนด custom filter สำหรับ serialize Java objects เราต้องใช้คลาส FilterProvider เพื่อกำหนด filter และได้ filter instance จริง Filter ที่ตั้งค่าแล้วจะถูก assign ให้ ObjectMapper ผ่าน FilterProvider

Syntax

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

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

import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;

public class JsonFilterAnnotationTest {
    public static void main(String args[]) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        
        FilterProvider filterProvider = new SimpleFilterProvider()
            .addFilter("customFilter", 
                SimpleBeanPropertyFilter.filterOutAllExcept("empName"));
        
        String jsonString = mapper.writer(filterProvider).writeValueAsString(new FilterBean());
        System.out.println(jsonString);
    }
}

@JsonFilter("customFilter")
class FilterBean {
    public int empId = 110;
    public String empName = "Raja Ramesh";
    public String gender = "male";
}

ผลลัพธ์ (Output)

{"empName":"Raja Ramesh"}

คำอธิบาย

ในตัวอย่าง customFilter ถูกประกาศใน @JsonFilter และถูกกำหนดค่าใน FilterProvider โดยใช้ SimpleBeanPropertyFilter.filterOutAllExcept("empName") ซึ่งหมายถึง "เก็บเฉพาะ empName ตัดฟิลด์อื่นทิ้ง" ผลลัพธ์คือ JSON ที่มีแค่ empName เท่านั้น

Filter Types อื่นๆ

  • filterOutAllExcept(...) - เก็บเฉพาะฟิลด์ที่ระบุ
  • serializeAllExcept(...) - serialize ทุกฟิลด์ยกเว้นที่ระบุ
  • filterOutAll() - กรองทุกฟิลด์ออก (empty object)
  • Custom filter - implement PropertyFilter interface เอง

Dynamic Filtering

สามารถเปลี่ยน filter ระหว่าง runtime ได้:

// สำหรับ admin - แสดงทุกอย่าง
SimpleBeanPropertyFilter.serializeAll()

// สำหรับ user - แสดงเฉพาะบางฟิลด์
SimpleBeanPropertyFilter.filterOutAllExcept("id", "name", "email")

สรุป

@JsonFilter ให้ความสามารถในการ dynamic filtering ของ JSON output ตาม context (user role, API version, etc.) โดยไม่ต้องสร้าง DTO หลายแบบ เป็นเครื่องมือทรงพลังสำหรับ REST API development