Spring 3.0, делающий ответ JSON с помощью jackson, передает преобразователь

я настраиваю свой messageconverter как Jackson затем

class Foo{int x; int y}

и в контроллере

@ResponseBody
public Foo method(){
   return new Foo(3,4)
}

от этого я ожидаю возвращать строку JSON {x: '3', y: '4'} с сервера без любой другой конфигурации. но получая 404 ошибочных ответа на мой запрос ajax

Если метод аннотируется @ResponseBody, тип возврата записан в Тело HTTP ответа. Возвращаемое значение будет преобразовано в заявленное использование типа аргумента метода HttpMessageConverters.

Я неправильно? или если я преобразовываю свой Объект ответа в строку Json сам с помощью сериализатора и затем возвращая ту строку как ответ. (Я мог сделать строковые ответы правильно), или я должен сделать некоторые другие конфигурации? как добавляющие аннотации для класса Foo

вот мой conf.xml

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">

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

24
задан StaxMan 22 March 2010 в 16:52
поделиться

4 ответа

Ошибка HTTP 404 означает, что ресурс не может быть найден. Это может иметь 2 причины:

  1. URL-адрес запроса неверен (ошибка на стороне клиента или неправильный URL-адрес в данной ссылке / кнопке).
  2. Ресурса нет там, где вы ожидали (ошибка на стороне сервера).

Чтобы исправить 1, убедитесь, что вы используете или предоставляете правильный URL-адрес запроса (с учетом регистра!). Чтобы исправить 2, проверьте журналы запуска сервера на наличие ошибок запуска и исправьте их соответствующим образом.

Все это выходит за рамки опубликованного кода и информации.

2
ответ дан 29 November 2019 в 00:01
поделиться

Это просто предположение, но по умолчанию Jackson автоматически определяет только публичные поля (и публичные геттеры; но все сеттеры независимо от видимости). Это можно настроить (в версии 1.5) на автоматическое определение приватных полей, если это необходимо (подробности см. в здесь).

0
ответ дан 29 November 2019 в 00:01
поделиться

Я полагаю, что 404 не имеет отношения к вашему HttpMessageConverter. У меня была такая же ошибка 404, и причина в том, что я забыл, что на DispatcherServlet отправляются только запросы, соответствующие (я изменил сопоставление запросов с * .do на * .json). Может быть, это и ваш случай.

0
ответ дан 29 November 2019 в 00:01
поделиться

Это сработало для меня :

@RequestMapping(value = "{p_LocationId}.json", method = RequestMethod.GET)
protected void getLocationAsJson(@PathVariable("p_LocationId") Integer p_LocationId,
     @RequestParam("cid") Integer p_CustomerId, HttpServletResponse response) {
        MappingJacksonHttpMessageConverter jsonConverter = 
                new MappingJacksonHttpMessageConverter();
        Location requestedLocation = new Location(p_LocationId);
        MediaType jsonMimeType = MediaType.APPLICATION_JSON;
        if (jsonConverter.canWrite(requestedLocation.getClass(), jsonMimeType)) {
        try {
            jsonConverter.write(requestedLocation, jsonMimeType,
                                   new ServletServerHttpResponse(response));
            } catch (IOException m_Ioe) {
                // TODO: announce this exception somehow
            } catch (HttpMessageNotWritableException p_Nwe) {
                // TODO: announce this exception somehow
            }
        }
}

Обратите внимание, что метод ничего не возвращает: MappingJacksonHttpMessageConverter # write () творит чудеса.

3
ответ дан 29 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: