У меня проблемы с тем, чтобы миксы Джексона работали для встроенных типов при использовании @ResponseBody. Я использую пружину MVC 3.0 и Джексон 1.8.
У меня есть объект с именем EventEntry. Этот объект имеет свойство user, возвращающее тип User через метод getUser. Я настроил миксины как для EventEntry, так и для пользователя. Миксины состоят из множества значений @JasonIgnoreProperties.
Когда EventEntry выходит из потока, миксин применяется правильно, и многие свойства игнорируются. Однако, когда объект User, являющийся частью объекта EventEntry, передается в потоковом режиме, миксин не применяется и возвращаются все свойства.
Код ниже:
public class EventEntry {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Пользовательский класс имеет множество свойств, большинство из которых я не хочу возвращать как часть объекта json.
В моем контроллере я добавляю нужные миксины, как показано ниже:
@RequestMapping(value = "/event/view/{eventIdentifier}/entries/json", method = RequestMethod.GET)
public @ResponseBody List<EventEntry> viewMyEventsJson(HttpServletResponse response, @PathVariable("eventIdentifier") String eventIdentifier){
ObjectMapper mapper = new ObjectMapper();
SerializationConfig serializationConfig = mapper.getSerializationConfig();
serializationConfig.addMixInAnnotations(EventEntry.class, BasicEventEntryJsonMixin.class);
serializationConfig.addMixInAnnotations(User.class, BasicPublicUserJsonMixin.class);
List<EventEntry> eventEntryList = getEventEntries(eventIdentifier);
try {
mapper.writValue(response.getOutputStream(), eventEntryList);
} catch (IOException ex) {
logger.error(ex);
}
return null;
}
Я добавил два миксина, один для EventEntry, другой для пользователя. Как и раньше, EventEntry содержит метод getUser ().
Оба миксина просто содержат множество значений @JsonIgnoreProperty:
@JsonIgnoreProperties({"eventId","lastUpdatedOn","lastUpdatedBy"})
public class BasicEventEntryJsonMixin extends EventEntry{
//Empty by design
}
@JsonIgnoreProperties({"emailAddress","lastUpdatedOn","lastUpdatedBy"})
public class BasicPublicUserJsonMixin extends User {
}
Миксин для EventEntry применяется корректно, а миксин для пользователя - нет, весь объект вытягивается.
Единственный конфиг, который у меня есть для Джексона, это
<bean id="messageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<!-- Support JSON -->
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
Миксины не применяются к встроенным объектам или я что-то неправильно настроил?
Кроме того, есть ли более аккуратный способ достижения того, что я хочу сделать, а именно, по сути, решить для каждого вида, какие свойства должны быть возвращены, а какие нет?