Ich versuche, eine POST-Anfrage an ein Servlet zu senden. Die Anfrage wird über jQuery folgendermaßen gesendet:
var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);
wo newCategory ist
function newCategory(productCategory)
{
$.postJSON("ajax/newproductcategory", productCategory, function(
idProductCategory)
{
console.debug("Inserted: " + idProductCategory);
});
}
und postJSON ist
$.postJSON = function(url, data, callback) {
return jQuery.ajax({
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': JSON.stringify(data),
'dataType': 'json',
'success': callback
});
};
Mit Firebug sehe ich, dass JSON korrekt gesendet wird:
{"idProductCategory":1,"description":"Descrizione2"}
Aber ich bekomme 415 nicht unterstützten Medientyp. Spring MVC Controller hat Signatur
@RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
@RequestBody ProductCategory productCategory)
Vor einigen Tagen hat es funktioniert, jetzt ist es nicht mehr. Ich werde bei Bedarf mehr Code anzeigen. Vielen Dank
var productCategory = { idProductCategory: 1, description: "Descrizione2" };
prägnanter und leichter zu lesen? Müssen Sie Spring anweisen, diesapplication/json
ausdrücklich zu akzeptieren ? Mit anderen Worten, erwartet es, dass die Daten in einer Form vorliegen?Antworten:
Ich hatte dies schon einmal mit Spring @ResponseBody und das lag daran, dass mit der Anfrage kein Accept-Header gesendet wurde. Das Akzeptieren von Headern kann mit jQuery schwierig sein, aber dies hat für mich als Quelle funktioniert
Der Content-Type-Header wird von @RequestBody verwendet, um zu bestimmen, in welchem Format die vom Client in der Anforderung gesendeten Daten vorliegen. Der Accept-Header wird von @ResponseBody verwendet, um zu bestimmen, in welchem Format die Daten in der Antwort an den Client zurückgesendet werden sollen. Deshalb brauchen Sie beide Header.
quelle
Hinzufügen eines Inhaltstyps zur Anforderung,
application/json
um das Problem zu behebenquelle
Ich hatte ein ähnliches Problem, stellte jedoch fest, dass ich es versäumt hatte, einen Standardkonstruktor für das DTO bereitzustellen, der mit @RequestBody kommentiert war.
quelle
Ich glaube, ich bin genau auf das gleiche Problem gestoßen. Nach unzähligen Stunden des Kampfes mit JSON, JavaScript und dem Server fand ich den Schuldigen: In meinem Fall hatte ich ein Datumsobjekt im DTO, dieses Datumsobjekt wurde in einen String konvertiert, damit wir es in der Ansicht mit dem anzeigen konnten Format: HH: mm.
Beim Zurücksenden von JSON-Informationen musste dieses Date String-Objekt wieder in ein vollständiges Date-Objekt konvertiert werden. Daher benötigen wir auch eine Methode, um es im DTO festzulegen. Das große ABER ist, dass Sie nicht zwei Methoden mit demselben Namen (Überladung) im DTO haben können, selbst wenn sie unterschiedliche Parametertypen (String vs Date) haben, da dies auch den Fehler 415 Nicht unterstützter Medientyp ergibt.
Dies war meine Controller-Methode
Dies war mein DTO-Beispiel (ID get / set- und preAlarm get-Methoden sind aus Gründen der Codekürzung nicht enthalten):
Damit alles funktioniert, müssen Sie die Methode mit dem Parameter Datumstyp entfernen. Dieser Fehler ist sehr frustrierend. Hoffe, dies kann jemandem Stunden beim Debuggen ersparen.
quelle
public void setParameters(List<Parameter> parameters)
&public void setParameters(Parameter... parameters)
Methoden in einer Bohne und änderte letztere,addParameters
um das Problem für mich zu lösen.Ich hatte ein ähnliches Problem und so habe ich es behoben.
Das Problem ist auf den Konvertierungsprozess von JSON nach Java zurückzuführen. Für die korrekte Konvertierung müssen die richtigen Jackson-Laufzeitbibliotheken vorhanden sein.
Fügen Sie die folgenden Jars hinzu (durch Abhängigkeit oder durch Herunterladen und Hinzufügen zum Klassenpfad.
Dies sollte das Problem beheben.
Vollständiger Code:
und die Controller-Signatur sieht folgendermaßen aus:
Hoffe das hilft
quelle
jackson-databind
ist erforderlich.Ich war mit diesem Problem konfrontiert, als ich Spring Boot in Spring MVC integrierte. Ich habe es gelöst, indem ich nur diese Abhängigkeiten hinzugefügt habe.
quelle
Eine kleine Randnotiz - bei der Entwicklung einer Webanwendung auf denselben Fehler gestoßen. Der Fehler, den wir beim Spielen mit dem Dienst mit Firefox Poster festgestellt haben, war, dass sowohl Felder als auch Werte im Json in doppelte Anführungszeichen gesetzt werden sollten. Zum Beispiel..
In unserem Fall haben wir den json über Javascript gefüllt, was nach dem, was ich gehört habe, etwas verwirrend sein kann, wenn es um den Umgang mit einfachen / doppelten Anführungszeichen geht.
Was bereits in diesem und anderen Beiträgen gesagt wurde, wie z. B. die Überschriften "Akzeptieren" und "Inhaltstyp", gilt ebenfalls.
Hoffe t'helps.
quelle
Ich habe es geschafft, wie es funktioniert. Sag es mir, falls ich falsch liege. Ich habe nur einen Weg zum Serialisieren / Deserialisieren verwendet: Ich habe alle diesbezüglichen Anmerkungen (
@JSONSerialize
und@JSONDeserialize
) entfernt und Serializer und Deserializer in derCustomObjectMapper
Klasse registriert . Ich habe keinen Artikel gefunden, der dieses Verhalten erklärt, aber ich habe es auf diese Weise gelöst. Hoffe es ist nützlich.quelle
Ich hatte das gleiche Problem. Ich musste die folgenden Schritte ausführen, um das Problem zu beheben:
1. Stellen Sie sicher, dass Sie die folgenden Abhängigkeiten haben:
2. Erstellen Sie den folgenden Filter:
3. Wenden Sie den obigen Filter für die Anforderungen in web.xml an
Ich hoffe, das ist für jemanden nützlich.
quelle
jackson-core
ist eine Abhängigkeit vonjackson-databind
, daher muss sie nicht direkt hinzugefügt werden.Frühlingsstiefel + Feder mvn
mit Problem
mit Lösung
quelle
Ich habe dieses Problem behoben, indem ich meinem POM eine Jackson-JSON-Datenbindung hinzugefügt habe.
quelle
Fügen Sie in Ihrer Modellklasse eine json-Eigenschaftsanmerkung hinzu und verfügen Sie über einen Standardkonstruktor
quelle
Ich hatte das gleiche Problem. Hinzufügen
zum spring-xml hat es gelöst
quelle
1.a. Fügen Sie Folgendes in applicationContext-mvc.xml hinzu
xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemaLocation = " http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc
quelle