Spring MVC: использование Jackson для входящих запросов и FlexJSON Serializer для ответов

Я хотел бы использовать Jackson для десериализации строк JSON из клиентских запросов в объекты Java и использовать FlexJson для сериализации объектов Java в ответ.

В двух словах проблема такова: как настроить Spring для использования Джексона ТОЛЬКО для обработки запросов, а не для ответа?

В servlet-context.xml у меня есть:

<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <beans:property name="messageConverters">
        <beans:list>
            <beans:ref bean="jsonMessageConverter"/>
        </beans:list>
    </beans:property>
</beans:bean>

<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean> 

And in the controller:

@RequestMapping(value = "settings")
public @ResponseBody String getSomeData(@RequestBody UserData userData) { 
    // userData is automatically deserialized by Jackson   
    MyView viewForClient = new MyView(userData);        

    return new JSONSerializer().include(MyView.SERILIZABLE_FIELDS).exclude("*", "*.class").serialize(viewForClient); // here I don't want Jackson to handle the response        
}

Но таким образом Джексон также преобразует в JSON ответ, уже преобразованный FlexJSON, который мне не нужен.

Есть ли решение? Спасибо.


person Dmitry B.    schedule 06.06.2014    source источник


Ответы (1)


У вас должна быть возможность создать собственный компонент MappingJackson2HttpMessageConverter, в который вы подключаете Jackson для методов сериализации и FlexJSON для методов десериализации.

person Misha    schedule 06.06.2014
comment
Да, это может сработать, однако я уже нашел лучший способ. Spring имеет ряд предварительно включенных экземпляров HttpRequestConverter по умолчанию и использует удобный в зависимости от типа содержимого запроса. Так что в моем случае было достаточно добавить зависимость Джексона в проект и отправить запрос с типом контента application/json. Это заставляет Джексона считывать данные из тела запроса и десериализовать их в объект. И ответ не обрабатывается Джексоном. - person Dmitry B.; 09.06.2014
comment
то же самое здесь, только что добавил jar-файлы jackson2, и вы можете делать такие вещи, как (at)RequestBody YourDomainObject yourDomainObject, и jackson делает свое дело. Я предполагаю, что если вы попытаетесь вернуть yourDomainObject, обратное действие сработает с (at)ResponseBody, но если вы используете flexjson, то вы, скорее всего, возвращаете ResponseEntity‹String›, который, похоже, не запускает обработку Джексона - person chrismarx; 05.06.2015