Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Tầm quan trọng của @JsonFilter trong Jackson (Java)

Annotation @JsonFilter định nghĩa **custom filter** động để include/exclude field khi serialize. Khác với @JsonIgnore (static), filter được cấu hình runtime qua FilterProvider.

Cú pháp

@Target({ANNOTATION_TYPE, TYPE, METHOD, FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface JsonFilter {
    String value(); // filter name
}

Ví dụ: Filter động chỉ giữ field "empName"

import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.*;
import com.fasterxml.jackson.databind.ser.impl.*;

public class JsonFilterTest {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        
        // Định nghĩa filter: chỉ giữ "empName"
        FilterProvider filters = new SimpleFilterProvider()
            .addFilter("customFilter", 
                SimpleBeanPropertyFilter.filterOutAllExcept("empName"));
        
        // Apply filter khi serialize
        String json = mapper.writer(filters).writeValueAsString(new FilterBean());
        System.out.println(json);
    }
}

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

Output

{"empName":"Raja Ramesh"}

Các Filter hữu ích khác

  • SimpleBeanPropertyFilter.serializeAllExcept("field1", "field2") - loại trừ vài field.
  • SimpleBeanPropertyFilter.filterOutAllExcept(...) - chỉ giữ vài field (whitelist).
  • Custom filter implement PropertyFilter để logic phức tạp.

Use case thực tế

  • **Dynamic API response**: Client truyền ?fields=id,name,email → server build filter runtime.
  • **Role-based serialization**: Admin thấy tất cả, User chỉ thấy public fields.
  • **Multiple views cho cùng entity**: Public view vs Internal view (giống @JsonView nhưng runtime).

So sánh @JsonFilter vs @JsonView

Đặc điểm @JsonFilter @JsonView
Cấu hình Runtime (FilterProvider) Compile-time (annotation trên field)
Linh hoạt Rất cao (dynamic) Cố định (static)
Performance Chậm hơn (runtime lookup) Nhanh hơn (compile-time)
Phù hợp Dynamic fields, RBAC, client-driven Fixed views, DTO pattern