Подтвердить что ты не робот

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

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

последний барабан Jackson уже находится в пути к классам

<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.

4b9b3361

Ответ 1

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>

Ответ 2

Получил работу после удаления Jackson 1. *, заменив его 2.4.4 (JAXRS), который будет импортировать все другие зависимости, джексон-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>

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

Удалено

import org.codehaus.jackson.annotate.JsonIgnoreProperties

Добавлен

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

Ответ 3

Я боролся с аналогичной проблемой, перейдя с 3.2 на spring 4.2. Получалось

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

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

Сочетание обоих предыдущих ответов также работает, если вы не хотите регистрировать пользовательский contentNegotiationManager, вы можете сделать следующее:

удалить все зависимости Jackson от

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>