Spring MappingJacksonJsonView, как сказать, чтобы использовать его вместо представления JSP? - PullRequest
4 голосов
/ 22 июля 2011

Я пытаюсь использовать MappingJacksonJsonView с Spring 3.0, но безуспешно.Я не знаю, что я делаю неправильно, я думаю, проблема в том, что я не знаю, как сказать, чтобы использовать MappingJacksonJsonView для отправки запроса.Я пытался использовать одно и то же имя для имени представления и имени компонента MappingJacksonView, но не сработало.Я создал пример тестового приложения здесь: https://github.com/stivlo/restjson

In web.xml Я определил ContextLoaderListener и отображение для dispatcherServlet.

In servlet-context.xml Я добавил

<mvc:annotation-driven/>

и

<bean name="jsonView"
    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

В org.obliquid.restjson.web.ToDoList.java Я установил логическое имя представления как jsonView.

Однако вместо использования MappingJacksonJsonView он ищет файл JSP, в соответствии с моим отображением JSP.

message /restjson/WEB-INF/jsp/jsonView.jsp
description The requested resource (/restjson/WEB-INF/jsp/jsonView.jsp) 
    is not available.

Чтоя должен перейти на использование MappingJacksonJsonView в качестве средства визуализации?

UPDATE 1 : В следующих тестах я обнаружил, что если я добавлю следующее в свой servlet-context.xml, рендеринг JSONработает, но мое другое представление, отображаемое как JSP (home), больше не работает.

<!-- Resolve views based on string names -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />

UPDATE 2 : я удалил BeanNameViewResolver и изменил свой ToDoList.java для возвратанепосредственно Коллекция для преобразования в JSON вместо ModelAndView с аннотацией @ResponseBody следующим образом:

@RequestMapping("/toDoList")
public @ResponseBody List<ToDoItem> test() {
    List<ToDoItem> toDoList = new ArrayList<ToDoItem>();        
    toDoList.add(new ToDoItem(1, "First thing, first"));
    toDoList.add(new ToDoItem(1, "After that, do the second task"));
    return toDoList;
}

Таким образом, это работает.Хотя отображение еще более «волшебное».Меня удивляет, если, например, существует похожий рендер для XML, как Spring узнает, какой рендер выбрать?

Ответы [ 4 ]

4 голосов
/ 22 июля 2011

Spring будет использовать заголовок Accept, отправленный клиентом для возврата к наиболее подходящему представлению. Здесь вы найдете мое полное приложение Spring MVC, которое возвращает и JSON, и XML.

Как видите, мне нужно только:

<mvc:annotation-driven />

Я также использовалте же аннотации: @RequestMapping для сопоставления запроса с методом и @ResponseBody для сообщения Spring, что то, что я возвращаю из контроллера, является фактическим ответом.Однако может потребоваться некоторая настройка / форматирование, и здесь Spring позаботится о том, чтобы упорядочить ваш объект в наиболее подходящий тип, такой как JSON.

2 голосов
/ 23 июля 2011

Вы должны сделать это следующим образом:

В своем XML-файле установите следующее: set

<mvc:annotation-driven />

После этого вам нужно установить сериализатор Jackson:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
  <list>
    <ref bean="jacksonMessageConverter"/>
  </list>
</property>
</bean>

после этого вы можете использовать его в вашем контроллере:

@RequestMapping(value="/getObjects",method = RequestMethod.POST)
     @ResponseBody
     public  List<MyObject> getCategories(){
     List<MyObject> objects = daoService.gettAllObjects();
     return objects;
    }
0 голосов
/ 22 мая 2015

вам нужно будет увидеть ContentNegotiatingViewResolver и установить для свойства defaultviews значение MappingJacksonJsonView , а @ResponseBody использует HttpMessageConverter вместо ViewSolver, чтобы увидеть различия между ними http://ufasoli.blogspot.com/2013/08/viewresolver-vs-messageconverter-spring.html

0 голосов
/ 24 июля 2014

Добавление следующего сработало в моем случае

<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="0" />
    </bean>

Таким образом, вначале мы должны попытаться разрешить любое представление как бин

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