Próbuję wysłać żądanie POST do serwletu. Żądanie jest wysyłane przez jQuery w następujący sposób:
var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);
gdzie jest newCategory
function newCategory(productCategory)
{
$.postJSON("ajax/newproductcategory", productCategory, function(
idProductCategory)
{
console.debug("Inserted: " + idProductCategory);
});
}
a postJSON jest
$.postJSON = function(url, data, callback) {
return jQuery.ajax({
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': JSON.stringify(data),
'dataType': 'json',
'success': callback
});
};
Z firebugiem widzę, że JSON jest wysyłany poprawnie:
{"idProductCategory":1,"description":"Descrizione2"}
Ale otrzymuję 415 Nieobsługiwany typ multimediów. Wiosenny kontroler mvc ma sygnaturę
@RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
@RequestBody ProductCategory productCategory)
Kilka dni temu działało, teraz nie. W razie potrzeby pokażę więcej kodu. Dzięki
var productCategory = { idProductCategory: 1, description: "Descrizione2" };
też bardziej zwięzłe i łatwiejsze do odczytania? Czy musisz powiedzieć Springowi, aby zaakceptowałapplication/json
konkretnie? Innymi słowy, czy oczekuje, że dane przyjdą w formie?Odpowiedzi:
Zdarzało mi się to już wcześniej w przypadku Spring @ResponseBody i stało się tak, ponieważ z żądaniem nie wysłano nagłówka akceptacji. Zebrane nagłówek może być ból do zestawu z jQuery, ale ten pracował dla mnie źródło
Nagłówek Content-Type jest używany przez @RequestBody do określenia formatu danych wysyłanych z klienta w żądaniu. Nagłówek accept jest używany przez @ResponseBody do określenia formatu, który ma odesłać dane do klienta w odpowiedzi. Dlatego potrzebujesz obu nagłówków.
źródło
dodanie typu zawartości do żądania jako
application/json
rozwiązało problemźródło
Miałem podobny problem, ale stwierdziłem, że zaniedbałem dostarczenie domyślnego konstruktora dla DTO z adnotacją @RequestBody.
źródło
Wydaje mi się, że napotkałem dokładnie ten sam problem. Po niezliczonych godzinach walki z JSON, JavaScriptem i serwerem, znalazłem winowajcę: w moim przypadku miałem obiekt Date w DTO, ten obiekt Date został przekonwertowany na String, więc mogliśmy go pokazać w widoku za pomocą format: HH: mm.
Kiedy informacje JSON były wysyłane z powrotem, ten obiekt Date String musiał zostać przekonwertowany z powrotem na pełny obiekt Date, dlatego potrzebujemy również metody, aby ustawić go w DTO. Wielkie ALE polega na tym, że nie można mieć 2 metod o tej samej nazwie (Przeciążenie) w DTO, nawet jeśli mają one inny typ parametru (ciąg vs data), ponieważ spowoduje to również błąd 415 nieobsługiwanego typu nośnika.
To była moja metoda kontrolera
To był mój przykład DTO (metody get / set i preAlarm get nie są uwzględnione w przypadku skrócenia kodu):
Aby wszystko działało, musisz usunąć metodę z parametrem typu Date. Ten błąd jest bardzo frustrujący. Mam nadzieję, że zaoszczędzi to komuś godzin debugowania.
źródło
public void setParameters(List<Parameter> parameters)
ipublic void setParameters(Parameter... parameters)
metody w fasoli, zmieniając tę drugą, abyaddParameters
rozwiązać problem za mnie.Miałem podobny problem i tak to naprawiłem,
Problem wynika z procesu konwersji z formatu JSON na Javę, aby konwersja przebiegła poprawnie, trzeba mieć odpowiednie biblioteki json w czasie wykonywania.
Dodaj następujące pliki JAR (przez zależność lub pobierając i dodając do ścieżki klas.
To powinno rozwiązać problem.
Kompletny kod:
a podpis kontrolera wygląda następująco:
Mam nadzieję że to pomoże
źródło
jackson-databind
jest wymagane.Napotkałem ten problem, gdy zintegrowałem but sprężynowy ze sprężyną MVC. Rozwiązałem to, dodając po prostu te zależności.
źródło
Mała uwaga dodatkowa - natknąłem się na ten sam błąd podczas tworzenia aplikacji internetowej. Błąd, który znaleźliśmy podczas zabawy z usługą Firefox Poster, polegał na tym, że zarówno pola, jak i wartości w pliku Json powinny być ujęte w podwójne cudzysłowy. Na przykład..
W naszym przypadku wypełniliśmy json za pomocą javascript, co może być trochę zagmatwane, jeśli chodzi o radzenie sobie z pojedynczymi / podwójnymi cudzysłowami, z tego, co słyszałem.
To, co zostało powiedziane wcześniej w tym i innych postach, takie jak dołączanie nagłówków „Akceptuj” i „Typ treści”, ma również zastosowanie.
Mam nadzieję, że pomoże.
źródło
Udało mi się to zrobić. Powiedz mi, jeśli się mylę. Użyłem tylko jednego sposobu serializacji / deserializacji: usunąłem wszystkie adnotacje dotyczące tego (
@JSONSerialize
i@JSONDeserialize
) i zarejestrowałem serializatory i deserializatory wCustomObjectMapper
klasie. Nie znalazłem artykułu wyjaśniającego to zachowanie, ale rozwiązałem w ten sposób. Mam nadzieję, że to przydatne.źródło
Miałem ten sam problem. Musiałem wykonać następujące kroki, aby rozwiązać problem:
1. Upewnij się, że masz następujące zależności:
2. Utwórz następujący filtr:
3. Zastosuj powyższy filtr dla żądań w pliku web.xml
Mam nadzieję, że to komuś się przyda.
źródło
jackson-core
jest zależnością odjackson-databind
, więc nie trzeba jej bezpośrednio dodawać.But sprężynowy + sprężyna MVN
z problemem
z roztworem
źródło
Rozwiązałem ten problem, dodając powiązanie danych jackson-json do mojego pom.
źródło
W klasie modelu dodaj adnotację właściwości JSON, miej również domyślny konstruktor
źródło
Miałem ten sam problem. dodanie
rozwiązał go spring-xml
źródło
1.a. Dodaj następujące w applicationContext-mvc.xml
xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemaLocation = " http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc
źródło