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.
Ответы
Ответ 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>