Spring MVC + Jackson: динамическая сериализация Json - PullRequest
4 голосов
/ 16 февраля 2011

Я использую Spring MVC 3.0.5 с Jackson 1.7.2.

Я хочу реализовать механизм назначения сериализатора Dynamic Bean, например, допустим, что мой контроллер MVC возвращает (@ResponseBody)Объект типа MyObject.По умолчанию SerializerFactory Джексона будет искать наиболее подходящий Serializer, включая мои пользовательские Serializer (например, CustomSerializer extends JsonSerializer<MyObject>).

Однако я хочу, чтобы мои пользовательские Serializer запускались только в случае, если какой-либо флаг активен (скажем, логическая переменная, прикрепленная к ThreadLocal).В противном случае я хочу использовать предоставленные Джексоном сериализаторы, сохраняя поведение по умолчанию MappingJacksonHttpMessageConverter без изменений.

Есть ли способ реализовать такой подход?

Я уже зарегистрировал свой собственныйObjectMapper, SerializerFactory и CustomSerializer в Spring <mvc:annotaion-driven /> default MappingJacksonHttpMessageConverter.

public class ConvertingPostProcessor implements BeanPostProcessor {

    private ObjectMapper jacksonJsonObjectMapper;

    public Object postProcessBeforeInitialization(Object bean, String name)
            throws BeansException {
        if (bean instanceof AnnotationMethodHandlerAdapter) {
            HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
            for (HttpMessageConverter<?> conv: convs) {
                if (conv instanceof MappingJacksonHttpMessageConverter) {
                    ((MappingJacksonHttpMessageConverter) conv).setObjectMapper(jacksonJsonObjectMapper);
                }
            }
        }
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String name)
            throws BeansException {
        return bean;
    }

    public void setJacksonJsonObjectMapper(ObjectMapper jacksonJsonObjectMapper) {
        this.jacksonJsonObjectMapper = jacksonJsonObjectMapper;
    }
}

И spring-mvc.xml будет:

<mvc:annotation-driven />
...
    <bean id="jacksonJsonObjectMapper" class="org.mycode.serialize.CustomObjectMapper">
        <property name="customSerializerFactory" ref="jacksonJsonCustomSerializerFactory" />
    </bean>

    <bean id="jacksonJsonCustomSerializerFactory" class="org.mycode.serialize.CustomSerializerFactoryRegistry">
        <property name="serializers">
            <map>
                <entry key="org.mycode.domain.MyObject" value-ref="customSerializer" />         
            </map>
        </property>
    </bean>

    <bean id="customSerializer" class="org.mycode.serialize.CustomSerializer">
        <property name="jacksonJsonCustomSerializerFactory" ref="jacksonJsonCustomSerializerFactory" />
    </bean>

    <bean id="convertingPostProcessor" class="org.mycode.serialize.ConvertingPostProcessor">
        <property name="jacksonJsonObjectMapper" ref="jacksonJsonObjectMapper" />
    </bean> 

Заранее спасибо !!

1 Ответ

2 голосов
/ 06 января 2012

Библиотека Джексона пока недостаточно зрелая. Так что рендеринг объекта модели проблематичен. Он предоставляет несколько аннотаций и фильтров для настройки визуализированного json, но этого недостаточно. Поэтому я предлагаю вам создать новые классы Java для просто представлений и сопоставить объекты домена с этим представлением.класс, использующий dozer framework end, возвращает это представление классов в responsebody.

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