사용자 도구

사이트 도구


java:jackson:jsonfilter

Jackson JsonFilter

  • @JsonFilter : Filter ID를 문자열로 지정한다. 일단 이 애노테이션을 사용하면 무조건 FilterProvider와 해당 ID를 처리하는 필터를 제공해야 한다.
  • Jackson Mixin과 조합하면 더 강력해진다.
  • SimpleFilterProvider
    • setDefaultFilter : Filter ID에 해당하는 필터가 존재하지 않을 경우 기본처리할 필터. 지정하지 않으면 오류 발생.
  • SimpleBeanPropertyFilter.filterOutAllExcept : 지정된 필드들만 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식을 권장한다. 명백히 검증된 필드만 내보낸다.
  • SimpleBeanPropertyFilter.serializeAllExcept : 지정된 필드를 제외한 나머지 모두를 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식은 추후에 추가되는 필드가 오류를 유발시키거나 보안상 위협이 될 수도 있기 때문에 권하고 싶지 않다.
  • objectMapper.writer(filterProvider)
  • objectMapper.setFilterProvider(new SimpleFilterProvider().addFilter(“filtername”, new MyJsonFilter())); 형태로 전역 등록 가능.
  • Lombok @FieldNameConstants 와 함께 사용하면 컴파일 오류가 줄어 들 것으로 보인다.

Nested Filter

Filter nested objects using Jackson's BeanPropertyFilter - Stack Overflow

@JsonFilter("personFilter")
public class Person {
    private Name name;
    private int age;
    public Name getName() {return name;}
    public void setName(Name name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
}
 
@JsonFilter("nameFilter")
public class Name {
    private String firstName;
    private String lastName;
    public String getFirstName() {return firstName;}
    public void setFirstName(String firstName) {this.firstName = firstName;}
    public String getLastName() {return lastName;}
    public void setLastName(String lastName) {this.lastName = lastName;}
}
And then add 2 filters, one for Person and one for Name:
 
FilterProvider filterProvider = new SimpleFilterProvider()
            .addFilter("personFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name"))
            .addFilter("nameFilter", SimpleBeanPropertyFilter.filterOutAllExcept("firstName"));

Spring 4.2 JsonFilter 지원

  @RequestMapping(method=RequestMethod.GET)
  public MappingJacksonValue getMovies(@AuthenticatedUser TutorialUser user){
    List<Movie> movieList = movieDao.findAll();
    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(movieList);
 
    mappingJacksonValue.setFilters(new SimpleFilterProvider().addFilter("movie", 
      SimpleBeanPropertyFilter.filterOutAllExcept(user!=null && user.isAdmin() ? all : limited)));
 
    return mappingJacksonValue;
  }

참고

java/jackson/jsonfilter.txt · 마지막으로 수정됨: 2020/11/23 15:43 저자 kwon37xi