я настраиваю свой 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>
Ошибка HTTP 404 означает, что ресурс не может быть найден. Это может иметь 2 причины:
Чтобы исправить 1, убедитесь, что вы используете или предоставляете правильный URL-адрес запроса (с учетом регистра!). Чтобы исправить 2, проверьте журналы запуска сервера на наличие ошибок запуска и исправьте их соответствующим образом.
Все это выходит за рамки опубликованного кода и информации.
Это просто предположение, но по умолчанию Jackson автоматически определяет только публичные поля (и публичные геттеры; но все сеттеры независимо от видимости). Это можно настроить (в версии 1.5) на автоматическое определение приватных полей, если это необходимо (подробности см. в здесь).
Я полагаю, что 404 не имеет отношения к вашему HttpMessageConverter. У меня была такая же ошибка 404, и причина в том, что я забыл, что на DispatcherServlet отправляются только запросы, соответствующие
(я изменил сопоставление запросов с * .do на * .json). Может быть, это и ваш случай.
Это сработало для меня :
@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 ()
творит чудеса.