Spring 3.0 делает JSON-ответ с использованием конвертера сообщений Джексона - PullRequest
23 голосов
/ 14 февраля 2010

я настраиваю свой конвертер сообщений как тогда Джексона

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>

Ответы [ 8 ]

22 голосов
/ 21 сентября 2010

Вам необходимо следующее:

  1. Установить модель программирования на основе аннотации: положить <mvc:annotation-driven /> в spring.xml
  2. Поместите jaskson jar (Maven artifactId равен org.codehaus.jackson:jackson-mapper-asl) в путь к классам.
  3. Использовать как следующее:

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
    public @ResponseBody Foo method(@Valid Request request, BindingResult result){
    return new Foo(3,4)
    }
    

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

Обратите внимание, что

  1. @ResponseBody применяется к типу возвращаемого значения, а не к определению метода.
  2. Вам нужна @RequestMapping аннотация, чтобы Spring мог ее обнаружить.
3 голосов
/ 23 февраля 2011

Интерфейс MessageConverter http://static.springsource.org/spring/docs/3.0.x/javadoc-api/ определяет метод getSupportedMediaTypes (), который в случае MappingJacksonMessageCoverter возвращает application / json

public MappingJacksonHttpMessageConverter() {
    super(new MediaType("application", "json", DEFAULT_CHARSET));
}

Я предполагаю, что заголовок запроса Accept: application / json отсутствует.

3 голосов
/ 07 мая 2010

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

@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() творит магию.

2 голосов
/ 14 февраля 2010

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

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

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

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

1 голос
/ 08 декабря 2010

Я обнаружил, что мне тоже нужен jackson-core-asl.jar, а не только jackson-mapper-asl.jar

0 голосов
/ 12 августа 2012

В дополнение к ответам здесь ..

если вы используете jquery на стороне клиента, это сработало для меня:

Java:

@RequestMapping(value = "/ajax/search/sync") 
public ModelAndView sync(@RequestBody Foo json) {

Jquery (необходимо включить json2.js Дугласа Крокфорда, чтобы иметь функцию JSON.stringify):

$.ajax({
    type: "post",
    url: "sync", //your valid url
    contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
    data: JSON.stringify(jsonobject), //json object or array of json objects
    success: function(result) {
        //do nothing
    },
    error: function(){
        alert('failure');
    }
});
0 голосов
/ 05 апреля 2010

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

0 голосов
/ 22 марта 2010

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

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