web-dev-qa-db-fra.com

Spring 4.1.1 RELEASE et @ResponseBody renvoient HTTP 406

J'utilise @ResponseBody pour renvoyer un objet Json dans Spring MVC. Cela fonctionne comme prévu dans les versions 4.0.7 et 3.2.11, mais il renvoie le statut HTTP 406 lorsque j'essaie d'utiliser la dernière version Spring 4.1.1 (à la date du 10/16) sans autre modification de la configuration. Est-ce considéré comme un bug ou le 4.1.1 nécessite-t-il une configuration différente?

le dernier pot Jackson est déjà dans le classpath

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

L'exemple sur le printemps document fonctionne bien

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

lorsque le type de retour est String. Le problème se produit lorsque le type de retour est un POJO.

11
Dino Tw

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>

et le fichier de configuration spring mvc (par exemple: 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>
17
Vito

Il a fonctionné après avoir supprimé Jackson 1. * en le remplaçant par le 2.4.4 (JAXRS), qui importera toutes les autres dépendances, jackson-core, jackson-databind et jackson-annotations. 

Supprimé  

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

Ajouté

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

et dans le servlet 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>

si l'annotation jackson est importée dans les fichiers de classe, elle doit également être remplacée

Supprimé

importer org.codehaus.jackson.annotate.JsonIgnoreProperties

Ajouté

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

8
Alias Eldhose

Je me débattais avec un problème similaire lors de la migration du 3.2 au printemps 4.2.

org.springframework.web.util.NestedServletException: le traitement de la demande a échoué; L'exception imbriquée est Java.lang.IllegalArgumentException: aucun convertisseur trouvé pour la valeur de retour de type:

posté ici pour que les gens puissent le trouver par nom d'exception :) Il m'a fallu une demi-journée pour trouver cet article. Merci @Vito et @Aias

La combinaison des deux réponses précédentes fonctionne également. Si vous ne souhaitez pas enregistrer la variable contentNegotiationManager personnalisée, vous pouvez procéder comme suit:

supprimer toutes les dépendances jackson de 

pom.xml

et utiliser le dernier

<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>
1
Vlad