Spring 4.1.1 RELEASE и @ResponseBody возвращают HTTP 406

Я использую @ResponseBody для возврата объекта Json в Spring MVC. Он работает, как и ожидалось, в версиях 4.0.7 и 3.2.11, но возвращает HTTP-статус 406, когда я пытаюсь использовать последнюю версию Spring 4.1.1(по состоянию на 10/16) без каких-либо других изменений конфигурации. Это считается ошибкой или 4.1.1 требует другой конфигурации?

последняя банка Джексона уже в classpath

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

Пример документа Spring работает нормально

@RequestMapping(value = "/something", method = RequestMethod.PUT)
@ResponseBody
public String helloWorld() {
  return "Hello World";
}

когда тип возвращаемого значения String. Проблема возникает, когда типом возврата является POJO.

3 ответа

Решение

Maven pom.xml:

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

и конфигурационный файл spring mvc (например, spring-mvc.xml)

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

Работает после удаления Jackson 1.* с заменой на 2.4.4 (JAXRS), которая будет импортировать все другие зависимости, jackson-core, jackson-databind и jackson-annotations.

Удалены

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

добавленной

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-base</artifactId>
    <version>2.4.4</version>
</dependency>

http://www.codingpedia.org/ama/jquery-ui-autocomplete-not-working-in-spring-4-1/

а в сервлете xml

<mvc:annotation-driven  content-negotiation-manager="contentNegotiationManager" />

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
     <property name="favorPathExtension" value="false" />
     <property name="favorParameter" value="true" />
     <property name="mediaTypes" >
          <value>
               json=application/json
               xml=application/xml
          </value>
     </property>
</bean>

если аннотация Джексона импортируется в файлы классов, ее также следует заменить

Удалены

импортировать org.codehaus.jackson.annotate.JsonIgnoreProperties

добавленной

импорт com.fasterxml.jackson.annotation.JsonIgnoreProperties

Я боролся с подобной проблемой, переходя от 3.2 до весны 4.2. Получал

org.springframework.web.util.NestedServletException: обработка запроса не удалась; Вложенное исключение - java.lang.IllegalArgumentException: не найдено преобразователя для возвращаемого значения типа:

разместив его здесь, чтобы люди могли найти его по имени исключения:) Мне понадобилось полдня, чтобы найти эту статью. Спасибо @Vito и @Aias

Комбинация обоих предыдущих ответов также работает, если вы не хотите регистрировать пользовательские contentNegotiationManager Вы можете сделать следующее:

удалить все зависимости Джексона от

pom.xml

и использовать последний

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-base</artifactId>
    <version>2.6.1</version>
</dependency>

servlet.xml

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>
Другие вопросы по тегам