jackson を使用してオブジェクトの階層をシリアル化しようとしていますが、各コントローラー メソッドで異なるフィールドを使用する必要があります。現在、私はこれを行います:
@RequestMapping(value = "/chat/message/create",
headers = "Accept=application/json",
produces = MediaType.APPLICATION_JSON_VALUE,
method = RequestMethod.GET
)
@Transactional
public @ResponseBody
ChatMessage createChatMessage(@RequestParam("chat_id") Integer chatId,
@RequestParam("chat_from_id") Integer chatFromId,
@RequestParam("chat_content") String content) {
User fromUser = userDAO.find(User.class, chatFromId);
ChatMessage message = new ChatMessage();
message.setContent(content);
message.setLastUpdateDate(new Date());
message.setFromUser(fromUser);
Chat chat = chatDAO.find(Chat.class, chatId);
message.setChat(chat);
chatMessageDAO.save(message);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
FilterProvider filters = new SimpleFilterProvider()
.addFilter("chatMessageFilter", SimpleBeanPropertyFilter.serializeAllExcept(Collections.EMPTY_SET));
ObjectWriter writer = mapper.writer(filters);
try {
return writer.writeValueAsString(message);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
問題は、MappingJackson2HttpMessageConverter を使用したいのですが、beanpropertyfilters のリストのフィルター プロバイダーを設定する方法が見つかりません。私はこのようなことをしたい:
@RequestMapping(value = "/chat/message/create",
headers = "Accept=application/json",
produces = MediaType.APPLICATION_JSON_VALUE,
method = RequestMethod.GET
)
@Transactional
public @ResponseBody
ChatMessage createChatMessage(@RequestParam("chat_id") Integer chatId,
@RequestParam("chat_from_id") Integer chatFromId,
@RequestParam("chat_content") String content) {
User fromUser = userDAO.find(User.class, chatFromId);
ChatMessage message = new ChatMessage();
message.setContent(content);
message.setLastUpdateDate(new Date());
message.setFromUser(fromUser);
Chat chat = chatDAO.find(Chat.class, chatId);
message.setChat(chat);
chatMessageDAO.save(message);
getFilterProvider().addFilter("chatMessageFilter", SimpleBeanPropertyFilter.serializeAllExcept(Collections.EMPTY_SET));
return message;
}
getFilterProvider() は、MappingJackson2HttpMessageConverter によって使用される FilterProvider を取得します。そうすれば、あるメソッドで 5 つまたは 6 つのフィルターを設定し、別のメソッドでまったく異なるフィルター セットを設定します。
注: Json ビューはここでは役に立ちません。それらは静的すぎるため、組み合わせて、ネストされたオブジェクトに使用するビューを指定することはできません。