Czy ktoś może wyjaśnić adnotacje @RequestBody
i @ResponseBody
w Spring 3? Do czego one służą? Wszelkie przykłady byłyby świetne.Adnotacje @RequestBody i @ResponseBody na wiosnę
Odpowiedz
Istnieje cała sekcja w dokumentach o nazwie 16.3.3.4 Mapping the request body with the @RequestBody annotation. I jeden o nazwie 16.3.3.5 Mapping the response body with the @ResponseBody annotation. Proponuję skonsultować te sekcje. Również istotne: @RequestBody
Javadocs, @ResponseBody
Javadocs
przykłady wykorzystania byłoby coś takiego:
Korzystanie z Javascript biblioteki takich jak jQuery, byś umieścić JSON-Object tak:
{ "firstName" : "Elmer", "lastName" : "Fudd" }
Twój metoda kontroler będzie wyglądać 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 Jackson na ścieżce klas (i mieć konfigurację <mvc:annotation-driven>
), Spring będzie konwertować przychodzący JSON do obiektu UserStats z treści posta (ponieważ dodano adnotację) i będzie serializować zwracany obiekt do JSON (ponieważ dodałeś adnotację @ResponseBody
). Więc Przeglądarka/klient zobaczy ten wynik JSON:
{ "description" : "Elmer Fudd hates wacky wabbits" }
Zobacz tę poprzednią odpowiedź kopalni dla kompletnego przykład robocza: https://stackoverflow.com/a/5908632/342852
Uwaga: RequestBody/ResponseBody nie jest oczywiście ograniczony do JSON, oba mogą obsługuje wiele formatów, w tym zwykły tekst i XML, ale JSON jest prawdopodobnie najczęściej używanym formatem.
Aktualizacja: Odkąd wiosennym 4.x, zwykle nie będzie używać @ResponseBody
na poziomie metody, ale raczej @RestController
na poziomie klasy, z tym samym skutkiem. Zobacz Creating REST Controllers with the @RestController annotation
package com.programmingfree.springshop.controller;
import java.util.List;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;
@RestController
@RequestMapping("/shop/user")
public class SpringShopController {
UserShop userShop=new UserShop();
@RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
public User getUser(@PathVariable int id) {
User user=userShop.getUserById(id);
return user;
}
@RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
public List<User> getAllUsers() {
List<User> users=userShop.getAllUsers();
return users;
}
}
W powyższym przykładzie, że będzie wyświetlać wszystkie dane użytkownika, a zwłaszcza id teraz chcę używać zarówno identyfikator i nazwę,
1) localhost: 8093/plejson/sklep/user < - --this link będzie wyświetlać wszystkie dane użytkownika
2) localhost: 8093/plejson/sklep/user/11 < ---- jeśli mogę użyć w 11 elementów złącznych, to wyświetli dany użytkownik 11 szczegóły
teraz chcesz używać zarówno identyfikatora, jak i nazwy:
localhost: 8093/plejson/shop/user/11/raju < ----------------- lubię to oznacza, że możemy użyć dowolnego w tym celu, pomóżcie mi .....
Proszę poprawić formatowanie odpowiedzi i przykładowy kod. –
Proszę opisać, w jaki sposób ten kod pomaga ankieterowi. Dziękuję Ci. –
http://www.programming-free.com/2014/03/spring-mvc-40-restful-web-service-json.html .................. ..przez ten link dostaniesz ... dziękuję – user5409646
@RequestBody: Adnotacja wskazująca parametr metody powinna być powiązana z treścią żądania HTTP.
Na przykład:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
@ResponseBody adnotacji można umieścić na metody i wskazuje, że typ zwracany powinien być napisany prosto do korpusu odpowiedzi HTTP (a nie umieszczone w modelu, lub interpretowane jako nazwa widoku).
Na przykład:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public @ResponseBody String helloWorld() {
return "Hello World";
}
Alternatywnie, możemy użyć @RestController adnotacji zamiast @Controller
adnotacji. Spowoduje to usunięcie konieczności korzystania z @ResponseBody
.
Poniżej znajduje się przykład sposobu w kontrolerze Java.
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
Korzystając @RequestBody adnotacji dostaniesz twoje wartości odwzorowany z utworzonego w systemie do obsługi żadnego konkretnego połączenia modelu. Korzystając z @ResponseBody, możesz wysłać wszystko z powrotem do miejsca, z którego wygenerowano żądanie. Obie rzeczy będą łatwo mapowane bez pisania żadnego niestandardowego analizatora składni itp.
Wielkie dzięki @Sean – leo
W połączonej odpowiedzi użyłeś adnotacji '@ ResponseBody' w parametrze, a nie w metodzie. Dostaję błędy próbując umieścić to na metodzie, więc zakładam, że twoja druga odpowiedź jest poprawna. Myślę, że powinieneś mieć 'getDescription (@RequestBody UserStats stats) powyżej. – Patrick
@Patrick nie, '@ RequestBody' jest na parametrze,' @ ResponseBody' jest na metodzie. ważna różnica! –