Джексон миксин не работает для встроенных типов в Spring MVC - PullRequest
1 голос
/ 04 июня 2011

У меня проблемы с тем, чтобы миксы Джексона работали для встроенных типов при использовании @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>

Миксины не применяются к встроенным объектам или я что-то неправильно настроил?

Кроме того, есть ли более аккуратный способ достижения того, что я хочу сделать, а именно, по сути, решить для каждого вида, какие свойства должны быть возвращены, а какие нет?

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

Причина в том, что вы настраиваете один Jackson Mapper, но используете другой (тот из Spring).

Сделайте это так:

@RequestMapping(value = "/event/view/{eventIdentifier}/entries/json",
                method = RequestMethod.GET)
public @ResponseBody String viewMyEventsJson(
           @PathVariable("eventIdentifier") String eventIdentifier)
           throws JsonGenerationException, JsonMappingException, IOException{
    ObjectMapper mapper = new ObjectMapper();
    SerializationConfig serializationConfig = mapper.getSerializationConfig();
    serializationConfig.addMixInAnnotations(EventEntry.class,
                                            BasicEventEntryJsonMixin.class);
    serializationConfig.addMixInAnnotations(User.class,
                                            BasicPublicUserJsonMixin.class);

    return mapper.writeValueAsString(getEventEntries(eventIdentifier));
}

, затем выдаже не нужна конфигурация xml

1 голос
/ 04 июня 2011

Я не знаю, почему дополнения будут игнорироваться; иногда фреймворки используют генерацию кода, и проблема заключается в том, что цель добавления не реализуется конечным экземпляром, но здесь это маловероятно. Если вы можете проверить, что такая же проблема возникает и за пределами Spring MVC, это может быть ошибкой в ​​обработке дополнений Джексона, поэтому, возможно, сначала попытайтесь изолировать проблему?

Что касается других способов, @JsonView - это самый простой способ определения исключений для каждого просмотра (см. http://wiki.fasterxml.com/JacksonJsonViews).. Более новой альтернативой является @JsonFilter (см. http://wiki.fasterxml.com/JacksonFeatureJsonFilter);, он более мощный и настраиваемый, но требует немного больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...