Весенний Json не решается с соответствующим ответом - PullRequest
12 голосов
/ 27 июля 2010

Я пытался заставить контроллер в Spring возвращать JSON-ответ безрезультатно, используя классы Джексона, как рекомендуется с 3.0 . Конечно, у меня есть файлы jar-файлов Jackson (jackson-core-asl-1.5.5.jar & jackson-mapper-asl-1.5.5.jar) в моем классе.

Что касается записей appconfig.xml, я не уверен, что они мне нужны. Я поместил их туда как последний акт отчаяния, прежде чем вернуться к старому не-json ajax.

В отладке я наблюдаю, как контроллер получает запрос, возвращает foo, а затем в firebug получает 406.

Сообщения об ошибках: Из регистратора, когда установлен для отладки: org.springframework.web.HttpMediaTypeNotAcceptableException: не удалось найти приемлемое представление

Из ответа: (406) Ресурс, идентифицированный этим запросом, способен генерировать ответы только с характеристиками, не приемлемыми в соответствии с заголовками запроса «принять» ().

Мой appconfig.xml находится здесь:

    <!-- Configures support for @Controllers -->
    <mvc:annotation-driven />

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="mediaTypes">
    <map>
      <entry key="html" value="text/html"/>
      <entry key="json" value="application/json"/>
    </map>
  </property>
  <property name="viewResolvers">
    <list>
      <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
      </bean>
    </list>
  </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages"></property>
    </bean>

Мой контроллер

@RequestMapping(value="foo/bar", method=RequestMethod.GET)
public @ResponseBody foo getFoo(@RequestParam String fooId) {
    return new foo(fooId); 
}

На jsp, где выполняется вызов ajax:

function addRow() {
$.getJSON("foo/bar",{ fooId: 1} , function(data) {
alert("it worked.");        
});
* *} Тысяча двадцать-один

Дайте мне знать, нужна ли еще какая-то информация.

Ответы [ 8 ]

14 голосов
/ 27 июля 2010

Избавьтесь от всех бобов Джексона и от отображения json в решателе согласований. mvc:annotation-driven должен сконфигурировать все необходимое для работы сериализации Джексона.

3 голосов
/ 10 октября 2014
  1. Убедитесь, что возвращаемое POJO имеет get (), по одному для каждого поля.
  2. Убедитесь, что на сервере приложений (Tomcat) есть библиотеки, даже если вы уверены, что ваша система сборки (Eclipse /Maven) делает.

У меня уже была эта ошибка дважды.Только сейчас я добавил добытчики в свое pojo.Ошибка 406 исчезла, и я получил JSON, как и ожидалось.Я предполагаю, что, поскольку мои поля были защищены пакетами (доступ по умолчанию), они бы захватили их, но я полагаю, что нет.Для справки, на случай, если это имеет значение, я также заставил POJO реализовать Serializable, toString (), serialVersionUID, конструктор без аргументов и явные конструкторы.

В предыдущий раз, когда я очищал / очищал / обновлял свой кэш Tomcatи сделал все, чтобы заставить его перезагрузить.Я полагаю, что когда я добавил зависимости Джексона, это исправило мои ошибки времени компиляции, но поскольку tomcat пропустил их, во время выполнения Spring MVC не обнаружил библиотеки Джексона и выдал ошибку 406 о недопустимом типе ответа.

2 голосов
/ 22 сентября 2014

Я знаю, что это старая ветка, но, возможно, кто-то столкнется с той же проблемой, что и я.Я получил это исключение при переносе приложения из Spring 4.0.3.RELEASE в Spring 4.1.0.RELEASE.В моем случае обновление Джексона с 1.9.x до 2.4.x добилось цели.

2 голосов
/ 26 июля 2012

Также убедитесь, что вы добавили два файла jar, относящихся к Джексону.

  • jackson-core-asl-1.9.8.jar
  • jackson-mapper-asl-1.9.8.jar

Версия может быть другой.

1 голос
/ 12 марта 2015

У меня такое же исключение при переходе с весны 3.x на весну 4.x.

Я решил это с обновлением зависимостей Джексона от

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

до

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.5.1</version>
    </dependency>

Мне больше ничего не нужно было.

1 голос
/ 31 марта 2012

Этот вопрос всплывает повсюду в сети, и я его укусил пару раз. Spring 3.0.6 (и, возможно, 5) имеет некоторые проблемы при рендеринге json. После того, как я сменил версию 3.1.0.RELEASE, все работало как есть. Без каких-либо изменений в конфигурации. Следует отметить, что метод return должен иметь @ResponseBody (как в предыдущем примере) и должен находиться в servlet-context.xml или в файле конфигурации контекста Spring.

1 голос
/ 25 октября 2010

Отправка заголовка Accept: application / xml не работает.Но отправка Accept: application / json на самом деле работает, и Jackson Mapper начинает работать. Я избавился от своего 406-го и получил свой сериализованный объект java в формате json с не более конфигом, чем @ResponseBody, и вернул новый MyObject () :) Спасибо skaffman за этоинформация, и спасибо Божо за рабочее значение заголовка: D

0 голосов
/ 27 июня 2012

Может быть, мой ответ немного запоздал, но это может помочь кому-то еще посетить этот вопрос.

Я решил мою проблему, добавив

 hibernate-validator-4.0.2 

, и дал мне еще одно исключение(класс не найден, исключение: org.slf4j.LoggerFactory), который я решил, добавив

slf4j-api-1.5.6.jar

Надеюсь, это кому-нибудь поможет.

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