Ich arbeite mit Spring Framework 4.0.7 zusammen mit MVC und Rest
Ich kann in Frieden arbeiten mit:
@Controller
ResponseEntity<T>
Beispielsweise:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
Mit der Methode (nur zum 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);
}
etwas zurückbringen
@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 gut
Ich kann dasselbe tun mit :
@RestController
(Ich weiß, es ist das gleiche wie@Controller
+@ResponseBody
)@ResponseStatus
Beispielsweise:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
Mit der Methode (nur zum 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());
}
etwas zurückbringen
@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 aus einem soliden Grund oder in einem bestimmten Szenario eine Option zwingend über der anderen verwendet werden muss
- Wenn (1) keine Rolle spielt, welcher Ansatz wird vorgeschlagen und warum.
quelle
ResponseEntity
, es ist flexibler. Ich hatte nur Zweifel@RestController
. Vielen DankUm die Antwort von Sotorios Delimanolis zu vervollständigen.
Das
ResponseEntity
gibt Ihnen zwar mehr Flexibilität, aber in den meisten Fällen werden Sie es nicht benötigen, und Sie werden dieseResponseEntity
überall in Ihrem Controller finden, was das Lesen und Verstehen erschwert.Wenn Sie Sonderfälle wie Fehler (Nicht gefunden, Konflikt usw.) behandeln möchten, können Sie
HandlerExceptionResolver
Ihrer Spring-Konfiguration eine hinzufügen . In Ihrem Code lösen Sie einfach eine bestimmte Ausnahme aus (NotFoundException
zum Beispiel) und entscheiden, was in Ihrem Handler zu tun ist (Setzen des HTTP-Status auf 404), wodurch der Controller-Code klarer wird.quelle
Laut offizieller Dokumentation: Erstellen von REST-Controllern mit der Annotation @RestController
Es scheint, dass es
@RestController
aus Gründen der Klarheit am besten ist, es zu verwenden , aber Sie können es auch kombinieren, um esResponseEntity
bei Bedarf flexibel zu gestalten ( laut offiziellem Tutorial und dem Code hier und meiner Frage, um dies zu bestätigen ).Beispielsweise:
ist das gleiche wie:
Auf diese Weise können Sie
ResponseEntity
nur bei Bedarf definieren .Aktualisieren
Sie können dies verwenden:
quelle
@ResponseStatus(HttpStatus.OK)
ignoriert zu werden, wenn Sie zurückkehrenResponseEntity<>(user, responseHeaders, HttpStatus.NOT_FOUND)
. Die HTTP-Antwort ist404
Eine ordnungsgemäße REST-API sollte als Antwort folgende Komponenten enthalten
Der Hauptzweck von ResponseEntity bestand darin, die Option 3 bereitzustellen. Ruheoptionen konnten ohne ResponseEntity erreicht werden.
Wenn Sie also den Speicherort der Ressource angeben möchten, ist die Verwendung von ResponseEntity besser, da dies sonst vermieden werden kann.
Stellen Sie sich ein Beispiel vor, in dem eine API geändert wird, um alle genannten Optionen bereitzustellen
Quelle - Frühling in Aktion
quelle