Czy ktoś może wyjaśnić adnotacje @RequestBody
i @ResponseBody
w Spring 3? Do czego służą? Wszelkie przykłady byłyby świetne.
Czy ktoś może wyjaśnić adnotacje @RequestBody
i @ResponseBody
w Spring 3? Do czego służą? Wszelkie przykłady byłyby świetne.
W dokumentach znajduje się cała sekcja o nazwie 16.3.3.4 Mapowanie treści żądania z adnotacją @RequestBody . I o nazwie 16.3.3.5 Mapowanie treści odpowiedzi za pomocą adnotacji @ResponseBody . Proponuję zapoznać się z tymi sekcjami. Istotne również: @RequestBody
javadocs,@ResponseBody
javadocs
Przykłady użycia wyglądałyby mniej więcej tak:
Korzystając z biblioteki JavaScript, takiej jak JQuery, opublikowałbyś obiekt JSON w następujący sposób:
{ "firstName" : "Elmer", "lastName" : "Fudd" }
Twoja metoda kontrolera wyglądałaby następująco:
// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}
// domain / value objects
public class UserStats{
private String firstName;
private String lastName;
// + getters, setters
}
public class Description{
private String description;
// + getters, setters, constructor
}
Teraz, jeśli masz Jacksona na swojej ścieżce klas (i masz <mvc:annotation-driven>
konfigurację), Spring przekonwertuje przychodzące JSON na obiekt UserStats z treści posta (ponieważ dodałeś @RequestBody
adnotację) i serializuje zwrócony obiekt do JSON (ponieważ dodałeś @ResponseBody
adnotacja). Więc przeglądarka / klient zobaczy następujący wynik JSON:
{ "description" : "Elmer Fudd hates wacky wabbits" }
Zobacz moją poprzednią odpowiedź, aby uzyskać pełny przykład roboczy: https://stackoverflow.com/a/5908632/342852
Uwaga: RequestBody / ResponseBody nie ogranicza się oczywiście do JSON, oba mogą obsługiwać wiele formatów, w tym zwykły tekst i XML, ale JSON jest prawdopodobnie najczęściej używanym formatem.
Od wiosny 4.x zwykle nie będziesz używać @ResponseBody
na poziomie metody, ale raczej@RestController
na poziomie klasy, z takim samym efektem.
Oto cytat z oficjalnej dokumentacji Spring MVC :
@RestController
jest złożoną adnotacją, która sama jest meta-adnotacją za pomocą@Controller
i w@ResponseBody
celu wskazania kontrolera, którego każda metoda dziedziczy@ResponseBody
adnotację na poziomie typu, a zatem zapisuje bezpośrednio do treści odpowiedzi w przeciwieństwie do rozdzielczości widoku i renderowania za pomocą szablonu HTML.
@ResponseBody
adnotacji dotyczącej parametru, a nie metody. Przy próbie przypisania tego do metody pojawiają się błędy, więc zakładam, że druga odpowiedź jest poprawna. Myślę, że powinieneś miećgetDescription(@RequestBody UserStats stats)
powyżej.@RequestBody
jest na parametrze,@ResponseBody
jest na metodzie. ważna różnica!@ResponseBody
. Jak właśnie powiedziałeś,@RequestBody
idzie o parametr, prawda? Ale w powyższej odpowiedzi masz to na metodzie.@RequestBody
jest nadal wymagany,@ResponseBody
jest niejawny podczas używania@RestController
. Proszę poprawić swoją odpowiedź, ma zbyt wiele głosów pozytywnych, aby być fałszywymi!@RestController
i została zmieniona, gdy została wprowadzona@RequestBody : Adnotacja wskazująca parametr metody powinna być powiązana z treścią żądania HTTP.
Na przykład:
@ResponseBodyAdnotację można umieścić na metodzie i wskazać, że zwracany typ powinien zostać zapisany bezpośrednio w treści odpowiedzi HTTP (a nie umieszczony w modelu ani interpretowany jako nazwa widoku).
Na przykład:
Alternatywnie możemy użyć adnotacji @RestController zamiast
@Controller
adnotacji. To usunie potrzebę używania@ResponseBody
.po więcej szczegółów
źródło
Poniżej znajduje się przykład metody w kontrolerze Java.
Używając adnotacji @RequestBody, otrzymasz swoje wartości zmapowane z modelem utworzonym w systemie do obsługi dowolnego konkretnego wywołania. Korzystając z @ResponseBody, możesz odesłać wszystko z powrotem do miejsca, z którego zostało wygenerowane żądanie. Obie rzeczy zostaną łatwo zmapowane bez pisania niestandardowego parsera itp.
źródło
W powyższym przykładzie wyświetlą wszystkie dane użytkownika i szczegółowe dane identyfikacyjne, teraz chcę użyć zarówno identyfikatora, jak i nazwy,
1) localhost: 8093 / plejson / shop / user <--- ten link wyświetli wszystkie dane użytkownika
2) localhost: 8093 / plejson / shop / user / 11 <---- jeśli użyję 11 w linku oznacza, że będzie wyświetl 11 szczegółów konkretnego użytkownika
teraz chcę użyć zarówno identyfikatora, jak i nazwy
localhost: 8093 / plejson / shop / user / 11 / raju <----------------- w ten sposób oznacza to, że możemy użyć dowolnego w tym, pomóż mi ... .
źródło