문서의 이전 판입니다!
@JsonFilter
: Filter ID를 문자열로 지정한다. 일단 이 애노테이션을 사용하면 무조건 FilterProvider
와 해당 ID를 처리하는 필터를 제공해야 한다.SimpleFilterProvider
setDefaultFilter
: Filter ID에 해당하는 필터가 존재하지 않을 경우 기본처리할 필터. 지정하지 않으면 오류 발생.SimpleBeanPropertyFilter.filterOutAllExcept
: 지정된 필드들만 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식을 권장한다. 명백히 검증된 필드만 내보낸다.SimpleBeanPropertyFilter.serializeAllExcept
: 지정된 필드를 제외한 나머지 모두를 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식은 추후에 추가되는 필드가 오류를 유발시키거나 보안상 위협이 될 수도 있기 때문에 권하고 싶지 않다.objectMapper.writer(filterProvider)
@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; }
@Annotation
지옥이 필쳐질 수도 있다.@JsonView
, Spring MappingJacksonViewValue 지원ObjectMapper objectMapper = new ObjectMapper(); // 모르는 property에 대해 무시하고 넘어간다. DTO의 하위 호환성 보장에 필요하다. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // ENUM 값이 존재하지 않으면 null로 설정한다. Enum 항목이 추가되어도 무시하고 넘어가게 할 때 필요하다. objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
ObjectMapper mapper = new ObjectMapper() .registerModule(new ParameterNamesModule()) .registerModule(new Jdk8Module()) .registerModule(new JavaTimeModule());
// 전역설정 objectMapper.enable(SerializationFeature.INDENT_OUTPUT); // Writer 당 설정 new ObjectMapper() .writer() .withDefaultPrettyPrinter() .writeValueAsString(객체);
ObjectMapper.setDateFormat()
으로 SimpleDateFormat
을 지정할 수 있는데 이 경우 SimpleDateFormat
은 Thread Safe 하지 못해서 Jackson 이 매번 clone을 해서 재생성해서 날짜를 포맷팅한다.LocalDateTime
등을 사용하는게 좋겠다.@JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") private Date createdAt;