chrislhardin
chrislhardin

Reputation: 1745

Ignore Jackson @JsonFilter annotated on class

I have the code below... I want Jackson to ignore the @JsonFilter on a class in the else condition below. I only want it to consider the @JsonFilter in the event I have some filters.

@JsonFilter("filter")
public class Test {

}


  if (filters != null)
        mapper.writer(filters).writeValue(jsonGenerator,
                response.getOriginalResponse());
    else
        mapper.writeValue(jsonGenerator, response.getOriginalResponse());

Upvotes: 4

Views: 2218

Answers (2)

abhinav kumar
abhinav kumar

Reputation: 1803

If you apply JsonFilter then in every response Filter will be expected .I am providing a solution on how i tackled avoiding @JsonFilter on some scenario and applied on some scenario.

Problem Scenerio

 @Entity
@Table(name=“course")
@JsonFilter(“courseFilters")
public class CourseEntity implements Serializable{

    private static final long serialVersionUID = 1L;

     @Id
     @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;

     @Column(name = "favourite_course")
     private boolean favouriteCourse;
    
     @Column(name = "email_address")
     private String emailAddress;
    
     @Column(name = "created_on")
     private LocalDateTime createdOn; 
     
     @Column(name = “course_group")
     private String courseGroup;
     
     @JsonProperty("Level")
     @Column(name = "level")
     private String level;
….
}
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class CourseResponse {
        private String status;
        private Object data;
…….
}

@GetMapping(“/filterCourses”)
    public ResponseEntity<CourseResponse> filterCourses() throws Exception {
        CourseResponse response = null;
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        SimpleBeanPropertyFilter simpleBeanFilter = SimpleBeanPropertyFilter.filterOutAllExcept(“emailAddress”,”courseGroup”,”level”);
      
          List<Course> courses = courseService.findAll();
          
            FilterProvider filterProvider = new SimpleFilterProvider().addFilter("courseFilters",simpleBeanFilter);
            
            ObjectWriter writer = mapper.writer(filterProvider);
            String writeValueAsString = writer.writeValueAsString(courses);
            List<Course> result = mapper.readValue(writeValueAsString, List.class);

                response = new CourseResponse(HttpStatus.OK.name(), result);
       return new ResponseEntity<>(response, HttpStatus.OK);
        
    }
@GetMapping(“/courses”)
    public ResponseEntity<CourseResponse> courses() throws Exception {
        CourseResponse response = null;
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        SimpleBeanPropertyFilter simpleBeanFilter = SimpleBeanPropertyFilter.filterOutAllExcept(“emailAddress”,”courseGroup”,”level”);
      
          List<Course> courses = courseService.findAll();

                response = new CourseResponse(HttpStatus.OK.name(), result);
        return new ResponseEntity<>(response, HttpStatus.OK);       
    }

From Above code snippet, /filterCourses will work fine and provide the filtered data but the unfiltered api /courses will show error saying No filter configured with id 'courseFilters' (type java.lang.String) (through reference chain: java.util.ArrayList[0])

Solution Approach

Remove @JsonFilter(“courseFilters") from CourseEntity and Create a class equivalent to CourseEntity for example CourseMixIn and apply same @JsonFilter(“courseFilters") on it and add below snippet to /filterCourses api

mapper.addMixIn(Course.class, CourseMixIn.class);

check the below code snippet for full source code

@JsonFilter(“courseFilters")
public class CourseMixIn implements Serializable{

    private static final long serialVersionUID = 1L;

     private Long id;

     private boolean favouriteCourse;
    
     private String emailAddress;
    
     private LocalDateTime createdOn; 
     
     private String courseGroup;
     
     private String level;
….
}
@GetMapping(“/filterCourses”)
    public ResponseEntity<CourseResponse> filterCourses() throws Exception {
        CourseResponse response = null;
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
       mapper.addMixIn(Course.class, CourseMixIn.class);
        SimpleBeanPropertyFilter simpleBeanFilter = SimpleBeanPropertyFilter.filterOutAllExcept(“emailAddress”,”courseGroup”,”level”);
      
          List<Course> courses = courseService.findAll();
          
            FilterProvider filterProvider = new SimpleFilterProvider().addFilter("courseFilters",simpleBeanFilter);
            
            ObjectWriter writer = mapper.writer(filterProvider);
            String writeValueAsString = writer.writeValueAsString(courses);
            List<Course> result = mapper.readValue(writeValueAsString, List.class);

                response = new CourseResponse(HttpStatus.OK.name(), result);
       return new ResponseEntity<>(response, HttpStatus.OK);
        
    }

Now both api /filterCourses and /courses will work fine

Upvotes: 0

chrislhardin
chrislhardin

Reputation: 1745

I did this to bypass the filter in the else condition.

     SimpleFilterProvider dummy = new SimpleFilterProvider();
        dummy.setFailOnUnknownId(false);
        mapper.writer(dummy).writeValue(jsonGenerator,
                response.getOriginalResponse());

Upvotes: 3

Related Questions