Wenn ResponseEntity & lt; T & gt; und @RestController für Spring RESTful-Anwendungen
Ich arbeite mit Spring Framework 4.0.7, zusammen mit MVC und Rest
Kann ich in Ruhe arbeiten mit:
@Controller
ResponseEntity<T>
Beispiel:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
Mit der Methode (einfach zu erstellen)
@RequestMapping(value="/", method=RequestMethod.POST)
public ResponseEntity<Void> createPerson(@RequestBody Person person, UriComponentsBuilder ucb){
logger.info("PersonRestResponseEntityController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
HttpHeaders headers = new HttpHeaders();
headers.add("1", "uno");
//http://localhost:8080/spring-utility/person/1
headers.setLocation(ucb.path("/person/{id}").buildAndExpand(person.getId()).toUri());
return new ResponseEntity<>(headers, HttpStatus.CREATED);
}
zurück etwas
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public ResponseEntity<Person> getPerson(@PathVariable Integer id){
logger.info("PersonRestResponseEntityController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return new ResponseEntity<>(person, HttpStatus.FOUND);
}
Funktioniert
Ich das gleiche tun, mit:
@RestController
(Ich weiß, es ist das gleiche, als@Controller
+@ResponseBody
)@ResponseStatus
Beispiel:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
Mit der Methode (einfach zu erstellen)
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void createPerson(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response){
logger.info("PersonRestController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
response.setHeader("1", "uno");
//http://localhost:8080/spring-utility/person/1
response.setHeader("Location", request.getRequestURL().append(person.getId()).toString());
}
zurück etwas
@RequestMapping(value="/{id}", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.FOUND)
public Person getPerson(@PathVariable Integer id){
logger.info("PersonRestController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return person;
}
Meine Fragen sind:
- wenn für eine solide Grund oder bestimmtes Szenario eine option muss verwendet werden, zwingend über die anderen
- Wenn (1) nicht egal, was Ansatz wird vorgeschlagen und warum.
InformationsquelleAutor der Frage Manuel Jordan | 2014-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
ResponseEntity
soll die gesamte HTTP-Antwort. Sie können Steuern, alles, was in ihm steckt: status-code, Header und body.@ResponseBody
ist ein marker für den HTTP-response-body und@ResponseStatus
erklärt der Statuscode der HTTP-Antwort.@ResponseStatus
ist nicht sehr flexibel. Es kennzeichnet die ganze Methode, so dass Sie sicher sein, dass Sie Ihre handler-Methode wird immer auf dieselbe Weise Verhalten. Und Sie kann immer noch nicht die Header. Sie brauchen denHttpServletResponse
oder eineHttpHeaders
parameter.Grundsätzlich
ResponseEntity
können Sie mehr tun.InformationsquelleAutor der Antwort Sotirios Delimanolis
Zur Vervollständigung der Antwort von Sotorios Delimanolis.
Es ist wahr, dass
ResponseEntity
gibt Ihnen mehr Flexibilität, aber in den meisten Fällen, die Sie nicht brauchen, und Sie werden am Ende mit diesenResponseEntity
überall in Ihrem controller, so dass es schwierig zu Lesen und zu verstehen.Wenn Sie möchten, behandeln spezielle Fälle, wie Fehler (Nicht Gefunden, Konflikt, etc.), Sie können eine
HandlerExceptionResolver
zu Spring-Konfiguration. Also in Ihrem code, müssen Sie nur werfen eine Ausnahme (NotFoundException
zum Beispiel) und entscheiden, was zu tun ist in Ihrem Handler (setzen des HTTP-status 404), so dass der Controller den code besser klar.InformationsquelleAutor der Antwort Matt
Laut offizieller Dokumentation: Erstellen von REST-Controller mit dem @RestController annotation
Es scheint, dass es ist am besten, um
@RestController
für die Klarheit, aber Sie können auch kombinieren es mitResponseEntity
für Flexibilität bei Bedarf (Nach offiziellen tutorial und der code hier und meine Frage, um zu bestätigen, dass).Beispiel:
ist das gleiche wie:
Diese Weise können Sie definieren
ResponseEntity
nur bei Bedarf.Update
Diese:
InformationsquelleAutor der Antwort Danail