Das ist mein Javascript:
function getWeather() {
$.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) {
alert('Success');
});
}
Das ist mein Controller:
@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 />
Diesen Fehler erhalten:
GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)
Überschriften:
Antwortheader
Server Apache-Coyote/1.1
Content-Type text/html;charset=utf-8
Content-Length 1070
Date Sun, 18 Sep 2011 17:00:35 GMT
Header anfordern
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
Interessanter Hinweis:
Ich erhalte den Fehler 406, aber die Abfrage im Ruhezustand funktioniert inzwischen. Dies sagt das Tomcat-Protokoll jedes Mal, wenn ich die Auswahl in der Dropbox ändere:
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=?
Was könnte das Problem sein? Es gab zwei ähnliche Fragen in SO, ich habe alle akzeptierten Hinweise dort ausprobiert, aber sie haben nicht funktioniert, denke ich ...
Irgendwelche Vorschläge? Fühlen Sie sich frei, Fragen zu stellen ...
mvc
da? Ich benutzte<tx:annotation-driven />
und tx istxmlns:tx="http://www.springframework.org/schema/tx"
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
und Spring-Web-3.0.x und Spring-Webmvc-3.0.x Gläser?tx:annotation-driven
ist das gleiche wiemvc:annotation-drive
oder etwas.Ich hatte das gleiche Problem, ab Latest Spring 4.1.1 müssen Sie pom.xml folgende Gläser hinzufügen.
Stellen Sie außerdem sicher, dass Sie folgendes Glas haben:
406 Spring MVC Json, gemäß der Anforderung "Accept" -Header nicht akzeptabel
quelle
MappingJacksonHttpMessageConverter
für Jackson 1 undMappingJackson2HttpMessageConverter
für Jackson 2 hinzugefügt . Jedes dieser Elemente ist gut genug, um JSON zu serialisieren / deserialisieren. Sie brauchen nur eine (gehen Sie mit Jackson 2, da es mehr Funktionen bietet).Es gibt einen anderen Fall, in dem dieser Status zurückgegeben wird: Wenn der Jackson-Mapper nicht herausfinden kann, wie Ihre Bean serialisiert werden soll. Wenn Sie beispielsweise zwei Zugriffsmethoden für dieselbe boolesche Eigenschaft haben
isFoo()
undgetFoo()
.Was passiert ist, dass der MappingJackson2HttpMessageConverter von Spring Jacksons StdSerializerProvider aufruft, um zu prüfen , ob er Ihr Objekt konvertieren kann.
StdSerializerProvider._createAndCacheUntypedSerializer
Wirft am Ende der Anrufkette einJsonMappingException
mit einer informativen Nachricht. Diese Ausnahme wird jedoch verschlucktStdSerializerProvider._createAndCacheUntypedSerializer
, was Spring mitteilt, dass das Objekt nicht konvertiert werden kann. Spring hat keine Konverter mehr und meldet, dass ihm keinAccept
Header zugewiesen wird, den er verwenden kann. Dies ist natürlich falsch, wenn Sie ihn geben*/*
.Es gibt einen Fehler für dieses Verhalten, aber es wurde als "kann nicht reproduzieren" geschlossen: Die aufgerufene Methode deklariert nicht, dass es werfen kann, daher ist das Schlucken von Ausnahmen anscheinend eine angemessene Lösung (ja, das war Sarkasmus). Leider hat Jackson keine Protokollierung ... und es gibt viele Kommentare in der Codebasis, die dies wünschen. Ich vermute, dass dies nicht das einzige versteckte Problem ist.
quelle
Ich hatte das gleiche Problem, meine Controller-Methode wird ausgeführt, aber die Antwort lautet Fehler 406. Ich debuggte
AbstractMessageConverterMethodProcessor#writeWithMessageConverters
und stellte fest, dass die MethodeContentNegotiationManager#resolveMediaTypes
immer zurückgibt,text/html
was nicht unterstützt wirdMappingJacksonHttpMessageConverter
. Das Problem ist, dass dasorg.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy
früher funktioniert alsorg.springframework.web.accept.HeaderContentNegotiationStrategy
und die Erweiterung meiner Anfrage/get-clients.html
die Ursache für mein Problem mit Fehler 406 ist. Ich habe gerade die Anforderungs-URL in geändert/get-clients
.quelle
Stellen Sie sicher, dass die folgenden 2
jar
im Klassenpfad vorhanden sind.Wenn einer oder beide fehlen, tritt dieser Fehler auf.
quelle
Endlich Antwort von hier gefunden:
Abbildung erholsamer Ajax-Anfragen auf den Frühling
Ich zitiere:
quelle
Checken Sie
<mvc:annotation-driven />
in dispatcherservlet.xml ein, wenn Sie es nicht hinzufügen. Und hinzufügendiese Abhängigkeiten in Ihrer pom.xml
quelle
quelle
Wahrscheinlich scrollt niemand so weit nach unten, aber keine der oben genannten Lösungen hat es für mich behoben, aber alle meine Getter-Methoden haben
public
es geschafft.Ich hatte meine Getter-Sichtbarkeit bei package-private belassen. Jackson entschied, dass es sie nicht finden konnte und explodierte. (Mit
@JsonAutoDetect(getterVisibility=NON_PRIVATE)
nur teilweise behoben.quelle
AbstractMap.SimpleImmutableEntry
dann auf herabgestuftAbstractMap.SimpleEntry
, immer noch keine Würfel, da es keinen Setter für den Schlüssel hat. Pojo darüber gegangen.Stellen Sie sicher, dass das gesendete Objekt (in diesem Fall Wetter) Getter / Setter enthält
quelle
Sollte sich in der Steuerung die Annotation des Antwortkörpers nicht auf den Rückgabetyp und nicht auf die Methode beziehen, wie folgt:
Ich würde auch die rohe Funktion jquery.ajax verwenden und sicherstellen, dass contentType und dataType richtig eingestellt sind.
In einem anderen Sinne finde ich das Federhandling von json ziemlich problematisch. Es war einfacher, wenn ich alles selbst mit Strings und GSON gemacht habe.
quelle
@ResponseBody
sollte keine Rolle spielen ... Ich werde mich mit GSON befassen ... möchte aber trotzdem, dass dieser JSON funktioniert, wenn möglich.Wie @atott erwähnt .
Wenn Sie die neueste Version von Jackson in Ihre pom.xml aufgenommen haben und mit Spring 4.0 oder neuer, die
@ResponseBody
Ihre Aktionsmethode verwendet und mit@RequestMapping
konfiguriert habenproduces="application/json;charset=utf-8"
, jedoch immer noch 406 (nicht akzeptabel) haben, müssen Sie dies wahrscheinlich ausprobieren Ihre MVC DispatcherServlet-Kontextkonfiguration:Auf diese Weise habe ich mein Problem endgültig gelöst.
quelle
Frühling 4.3.10: Ich habe die folgenden Einstellungen verwendet, um das Problem zu beheben.
Schritt 1: Fügen Sie die folgenden Abhängigkeiten hinzu
Schritt 2: Fügen Sie Folgendes in Ihre MVC DispatcherServlet-Kontextkonfiguration ein:
Seit Spring 3.2 ist favorPathExtension gemäß der Standardkonfiguration auf true gesetzt. Wenn die Anforderung uri über geeignete Erweiterungen wie
.htm
spring verfügt, wird der Erweiterung Priorität eingeräumt. In Schritt 2 hatte ich die contentNegotiationManager-Bean hinzugefügt, um dies zu überschreiben.quelle
Ich hatte das gleiche Problem, weil mir die Annotation @EnableWebMvc fehlte. (Alle meine Federkonfigurationen basieren auf Anmerkungen, das XML-Äquivalent wäre mvc: annotationsgesteuert.)
quelle
Stellen Sie sicher, dass Sie die richtige Jackson-Version in Ihrem Klassenpfad haben
quelle
WEB-INF/lib
Ordner hinzugefügt , aber immer noch das gleiche Problem: /Überprüfen Sie, wie @joyfun es für die richtige Version von Jackson getan hat, aber überprüfen Sie auch unsere Header ... Akzeptieren / möglicherweise nicht vom Client übertragen ... Verwenden Sie Firebug oder ein Äquivalent, um zu überprüfen, was Ihre Get-Anfrage tatsächlich sendet. Ich denke, dass das Header-Attribut der Annotation / möglicherweise / Literale überprüft, obwohl ich nicht 100% sicher bin.
quelle
Abgesehen von den offensichtlichen Problemen hatte ich ein anderes, das ich nicht beheben konnte, obwohl ich alle möglichen JARs, Abhängigkeiten und Anmerkungen in Spring Servlet aufgenommen hatte. Schließlich stellte ich fest, dass ich eine falsche Dateierweiterung habe, da ich meine, dass zwei separate Servlets im selben Container ausgeführt wurden und ich verschiedenen Dateierweiterungen zuordnen musste, wobei eine ".do" und die andere, wie sie für Abonnements verwendet wurde, zufällig benannt wurde ". sub ". Alles gut, aber SUB ist eine gültige Dateierweiterung, die normalerweise für Untertiteldateien von Filmen verwendet wird. Daher hat Tomcat den Header überschrieben und so etwas wie "text / x-dvd.sub ..." zurückgegeben. Alles war in Ordnung, aber die Anwendung erwartete JSON, bekam aber Untertitel Daher musste ich nur die Zuordnung in meiner
web.xml
Datei ändern, die ich hinzugefügt habe:quelle
Ich hatte das gleiche Problem, leider löste keine der hier aufgeführten Lösungen mein Problem, da mein Problem etwas in einer anderen Klasse war.
Ich habe zuerst überprüft, ob alle Abhängigkeiten vorhanden sind, wie von @bekur vorgeschlagen, und dann überprüft, ob die Anforderung / Antwort, die von Clients zum Server gesendet wird, alle Header vorhanden sind und von Jquery ordnungsgemäß festgelegt wurden. Ich überprüfte dann die
RequestMappingHandlerAdapter
MessageConverters
und alle 7 waren an Ort und Stelle, ich fing wirklich an, den Frühling zu hassen! Ich habe dann von Frühling4.0.6.RELEASE
auf aktualisiert,4.2.0.RELEASE
um eine andere Antwort als die oben genannte zu erhalten. Es warRequest processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type
Hier ist meine Controller-Methode
Die Lösung bestand darin, UploadPictureResult so zu gestalten, dass WebResponse nicht erweitert wird
Aus irgendeinem Grund konnte spring nicht bestimmen, wie UploadPictureReslt konvertiert werden soll, als WebResponse erweitert wurde
quelle
Ich verwende keine SSL-Authentifizierung und diese Jackson-Datenbank enthält jackson-core.jar und jackson-database.jar und ändere dann den RequestMapping-Inhalt wie folgt:
Achtung: Wenn Ihr Produkt nicht vom Typ "application / json" ist und ich dies nicht bemerkt habe und einen 406-Fehler erhalten habe, kann Ihnen dies helfen.
quelle
Überprüfen Sie diesen Thread. spring mvc restcontroller return json string p / s: Sie sollten Ihrer WebMvcConfig-Klasse eine Jack Son Mapping-Konfiguration hinzufügen
quelle
Dies ist die Update-Antwort für springVersion = 5.0.3.RELEASE.
Diese obigen Antworten werden nur mit älteren Versionen von springVersion <4.1 bearbeitet . Für den letzten Frühling müssen Sie folgende Abhängigkeiten in die Gradle-Datei einfügen:
Ich hoffe, dies ist hilfreich für diejenigen, die die neueste Frühlingsversion verwenden.
quelle
Können Sie das Header-Element in @RequestMapping entfernen und versuchen ..
Mögen
Ich denke, Spring führt eher eine "enthält Prüfung" als eine genaue Übereinstimmung für die Annahme von Headern durch. Trotzdem lohnt es sich, das Header-Element zu entfernen und zu überprüfen.
quelle
weatherService.getCurrentWeather(id);
"aktiviert" ... also funktioniert etwas ... ist es möglich, dass 406 angezeigt wird und SQL-Auswahl im Ruhezustand gleichzeitig funktioniert?