====== Jackson JsonFilter ======
* [[java:jackson|Java Jackson JSON Library]] @JsonFilter
* ''@JsonFilter'' : Filter ID를 문자열로 지정한다. 일단 이 애노테이션을 사용하면 무조건 ''FilterProvider''와 해당 ID를 처리하는 필터를 제공해야 한다.
* [[java:jackson:mixin|Jackson Mixin]]과 조합하면 더 강력해진다.
* ''SimpleFilterProvider''
* ''setDefaultFilter'' : Filter ID에 해당하는 필터가 존재하지 않을 경우 기본처리할 필터. 지정하지 않으면 오류 발생.
* **''SimpleBeanPropertyFilter.filterOutAllExcept''** : 지정된 필드들만 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식을 권장한다. 명백히 검증된 필드만 내보낸다.
* ''SimpleBeanPropertyFilter.serializeAllExcept'' : 지정된 필드를 제외한 나머지 모두를 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식은 **추후에 추가되는 필드가 오류를 유발시키거나 보안상 위협이 될 수도 있기 때문에 권하고 싶지 않다**.
* ''objectMapper.writer(filterProvider)''
* ''objectMapper.setFilterProvider(new SimpleFilterProvider().addFilter("filtername", new MyJsonFilter()));'' 형태로 전역 등록 가능.
* [[java:lombok:fieldnameconstants|Lombok @FieldNameConstants]] 와 함께 사용하면 컴파일 오류가 줄어 들 것으로 보인다.
===== Nested Filter =====
[[https://stackoverflow.com/questions/11036366/filter-nested-objects-using-jacksons-beanpropertyfilter|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 movieList = movieDao.findAll();
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(movieList);
mappingJacksonValue.setFilters(new SimpleFilterProvider().addFilter("movie",
SimpleBeanPropertyFilter.filterOutAllExcept(user!=null && user.isAdmin() ? all : limited)));
return mappingJacksonValue;
}
===== 참고 =====
* [[https://www.baeldung.com/jackson-serialize-field-custom-criteria|Serialize Only Fields that meet a Custom Criteria with Jackson]]
* [[http://javagalleog.blogspot.kr/2016/04/json-filters-for-spring-mvc.html|Java Tips for Geeks: JSON filters for Spring MVC]]
* [[https://www.concretepage.com/jackson-api/jackson-jsonfilter-example|Jackson @JsonFilter Example]]
* [[http://jsonobject.tistory.com/258|Jackson, 커스텀 @JsonFilter로 조건에 맞는 필드만 JSON 변환하기]]
* [[https://sdqali.in/blog/2016/06/08/filtering-responses-in-spring-mvc/|Filtering responses in Spring MVC - {code that works} by Sadique Ali]]
* [[http://blog.bafoly.com/2016/06/returning-role-based-content-in-spring-rest-controller/|Returning role based content in Spring Rest Controller – bbk notes]]
* [[https://github.com/Baeldung/spring-hypermedia-api/blob/master/src/main/java/com/baeldung/web/controller/NewBookController.java|spring-hypermedia-api/NewBookController.java at master · Baeldung/spring-hypermedia-api]]
* [[https://stackoverflow.com/questions/11036366/filter-nested-objects-using-jacksons-beanpropertyfilter|Filter nested objects using Jackson's BeanPropertyFilter - Stack Overflow]]
* [[https://xpam.pl/blog/?p=286|Receive only the data your client needs – full dynamic JSON filtering with Jackson | xpam.pl]]
* [[https://www.baeldung.com/jackson-serialize-field-custom-criteria|Serialize Only Fields that meet a Custom Criteria with Jackson | Baeldung]]
* [[https://jsonobject.tistory.com/258|mapper.setFilterProvider(new SimpleFilterProvider().addFilter("userJsonFilter", new UserJsonFilter()));]]