91 votes

Printemps JSON demande de prise en 406 (non Acceptable)

c'est mon javascript:

    function getWeather() {
        $.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) {
            alert('Success');                               
        });
    }

c'est mon contrôleur:

@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET)
@ResponseBody
public Weather getTemparature(@PathVariable("id") Integer id){
    Weather weather = weatherService.getCurrentWeather(id);
        return weather;
}

spring-servlet.xml

<context:annotation-config />
<tx:annotation-driven />

Obtenez cette erreur:

GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)

Les en-têtes:

En-Têtes De Réponse

Server  Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length  1070
Date    Sun, 18 Sep 2011 17:00:35 GMT

En-Têtes De Requête

Host    localhost:8080
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept  application/json, text/javascript, */*; q=0.01
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection  keep-alive
X-Requested-With    XMLHttpRequest
Referer http://localhost:8080/web/weather
Cookie  JSESSIONID=7D27FAC18050ED84B58DAFB0A51CB7E4

Note intéressante:

Je reçois 406 erreur, mais la requête hql œuvres pendant ce temps. C'est ce que tomcat journal dit, a chaque fois que je change de sélection dans dropbox:

 select weather0_.ID as ID0_0_, weather0_.CITY_ID as CITY2_0_0_, weather0_.DATE as DATE0_0_, weather0_.TEMP as TEMP0_0_ from WEATHER weather0_ where weather0_.ID=?

Quel pourrait être le problème? Il y avait deux questions similaires dans avant, j'ai essayé tous les accepté conseils de là, mais ils n'ont pas de travail, je suppose...

Toutes les suggestions? N'hésitez pas à poser des questions...

116voto

Villu Sepman Points 524

"406 Not Acceptable

La ressource identifiée par la demande est seulement capable de générer une réponse entités qui ont des caractéristiques de contenu n'est pas acceptable selon les accepter en-têtes envoyés dans la requête".

Ainsi, votre demande d'accepter d'en-tête de l'application/json et votre contrôleur n'est pas en mesure de revenir. Cela se produit lorsque le bon HTTPMessageConverter ne peuvent pas être trouvées pour répondre aux @ResponseBody annoté de la valeur de retour. HTTPMessageConverter sont automatiquement enregistrés lorsque vous utilisez l' <mvc:annotation-driven>, compte tenu de certaines 3-d des bibliothèques de tiers dans le classpath.

Soit vous n'avez pas la bonne Jackson bibliothèque dans votre classpath, ou vous n'avez pas utilisé le <mvc:annotation-driven> directive.

J'ai répliqué à votre scénario et il a bien fonctionné à l'aide de ces deux bibliothèques et n' headers="Accept=*/*" directive.

jackson-core-asl-1.7.4.jar jackson-mapper-asl-1.7.4.jar

Cheers, Villu

75voto

akb Points 1392

J'ai eu le même problème, avec le Dernier Printemps 4.1.1, vous devez ajouter la suite pots pom.xml.

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

assurez-vous également que vous avez jar suivants:

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

406 Spring MVC, Json, pas acceptable en fonction de la demande "accepter" les en-têtes

18voto

kdgregory Points 21849

Il existe un autre cas où ce statut sera retourné: si l'Jackson mappeur ne peut pas comprendre comment sérialiser vos haricots. Par exemple, si vous disposez de deux méthodes accesseur pour la même propriété booléenne, isFoo() et getFoo().

Ce qui se passe est que le Printemps est MappingJackson2HttpMessageConverter appels Jackson StdSerializerProvider pour voir si il peut convertir votre objet. Au bas de la chaîne d'appel, StdSerializerProvider._createAndCacheUntypedSerializer jette un JsonMappingException avec un message d'information. Toutefois, cette exception est avalé par StdSerializerProvider._createAndCacheUntypedSerializer, qui dit Printemps qu'il ne peut pas convertir l'objet. Avoir couru hors de convertisseurs, le Printemps des rapports que ce n'est pas un Accept - tête qu'il peut utiliser, ce qui bien sûr est faux lorsque vous êtes en lui donnant */*.

Il y a un bug de ce comportement, mais il a été fermé comme "impossible à reproduire": la méthode de ne pas déclarer qu'il peut jeter, donc avaler des exceptions est apparemment une solution appropriée (oui, c'était du sarcasme). Malheureusement, Jackson n'a pas toute la journalisation ... et il y a beaucoup de commentaires dans le code souhaitant qu'il a fait, je crois que ce n'est pas la seule caché gotcha.

16voto

atott Points 148

J'ai eu le même problème, ma méthode de contrôleur exécute mais la réponse est l'Erreur 406. Je debug AbstractMessageConverterMethodProcessor#writeWithMessageConverters et a constaté que la méthode de ContentNegotiationManager#resolveMediaTypes retourne toujours text/html ce qui n'est pas pris en charge par MappingJacksonHttpMessageConverter. Le problème est que l' org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy travaux plus tôt que d' org.springframework.web.accept.HeaderContentNegotiationStrategy, et l'extension de ma demande /get-clients.html est la cause de mon problème avec l'Erreur 406. Je viens de changer les url de demande d' /get-clients.

9voto

Raju Rathi Points 91

Assurez-vous que, suite à 2 jars'sont présents dans le chemin de classe.

Si l'un ou les deux sont manquant, alors cette erreur va venir.

jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X