Помогите с Spring-JSON с использованием аннотированных контроллеров - PullRequest
1 голос
/ 11 января 2010

Я искал в интернете пример, в котором использовались бы как Spring-JSON, так и аннотированные контроллеры, я новичок в Spring, поэтому мне не повезло, что я настроил конфигурацию на образцах Spring-JSON (он использует SimpleController et. и др.)

В настоящее время у меня есть контроллер с 2 сопоставлениями, один выводит результаты в html (и работает), другой должен отображать json для некоторых вызовов ajax, но когда я получаю доступ к URL, он возвращает 404 и запрашивает / myapp / jsp / jsonView .jsp. Код метода show действительно выполняется, и он даже проверяет наличие параметра id, поэтому, похоже, проблема в том, что он не знает, как выполнять рендеринг, насколько мне известно, это то, что делает bean-компонент viewResolver.

Заранее спасибо за любую помощь:)

Вот что у меня есть:

@Controller
public class ItemController {

 //This one works
 @RequestMapping(value = "/items", method = RequestMethod.GET)
 public ModelMap list() {
     ModelMap map = new ModelMap();
     map.addAttribute("item", "value");
     return map;
 }
 //This one returns 404, asks for jsonView.jsp
 @RequestMapping(value = "/items.json", method = RequestMethod.GET)
 public ModelAndView show(@RequestParam(value = "id", required = true) String id) {
    Map model = new HashMap();
    model.put("firstname", "Peter");
    model.put("secondname", "Schmitt");
    return new ModelAndView("jsonView", model);
  }
}

в myapp-servlet.xml:

    <bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"/>

на views.xml:

<beans>
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
    <property name="encoding">
        <value>UTF-8</value>
    </property>
    <property name="contentType">
        <value>application/json</value>
    </property>
    <property name="jsonWriter">
        <ref bean="sojoJsonWriter"/>
    </property>
    <property name="jsonErrors">
        <list>
            <ref bean="statusError"/>
            <ref bean="modelflagError"/>
        </list>
    </property>
</bean>

<bean name="sojoJsonWriter" class="org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter">
    <property name="convertAllMapValues">
        <value>true</value>
    </property>
</bean>

<bean name="statusError" class="org.springframework.web.servlet.view.json.error.HttpStatusError">
    <property name="errorCode">
        <value>311</value>
    </property>
</bean>
<bean name="modelflagError" class="org.springframework.web.servlet.view.json.error.ModelFlagError">
    <property name="name">
        <value>failure</value>
    </property>
    <property name="value">
        <value>true</value>
    </property>
</bean>

web.xml:

<servlet>
 <servlet-name>myapp</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>myapp</servlet-name>
 <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>

Ответы [ 2 ]

2 голосов
/ 11 января 2010

Может быть другая альтернатива: можете ли вы перейти на версию 3 (сейчас она находится в состоянии выпуска)? Существует фантастический ContentNegotiationResolver, который очень помогает, когда речь идет о передаче контента и разрешении представления.


<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 <property name="mediaTypes">
   <map>
   <entry key="xml" value="application/xml"/>
   <entry key="json" value="application/json"/>
...

Если теперь добавить .json к вашему URL-пути или использовать соответствующий HTTP-заголовок «Accept», переданный объект (см. Model.put (...)) соответствующим образом сериализуется. Для JSON Spring 3 используется Джексон по умолчанию.

1 голос
/ 14 января 2010

Проблема была с распознавателем представления в servlet.xml, добавлен атрибут p: order, чтобы он загружался до InternalResourceViewResolver

    <bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver" p:order="1"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/"p:suffix=".jsp" p:order="10"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...