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>