Reputation: 1745
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
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
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