Je travaille avec Spring Framework 4.0.7, avec MVC et Rest
Je peux travailler en paix avec:
@Controller
ResponseEntity<T>
Par exemple:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
Avec la méthode (juste pour créer)
@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);
}
retourner quelque chose
@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);
}
Fonctionne bien
Je peux faire la même chose avec :
@RestController
(Je sais que c'est la même chose que@Controller
+@ResponseBody
)@ResponseStatus
Par exemple:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
Avec la méthode (juste pour créer)
@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());
}
retourner quelque chose
@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;
}
Mes questions sont:
- lorsque, pour une raison solide ou un scénario spécifique, une option doit être obligatoirement utilisée par rapport à l'autre
- Si (1) n'a pas d'importance, quelle approche est suggérée et pourquoi.
la source
ResponseEntity
, c'est plus flexible. J'étais juste avec le doute@RestController
. MerciPour compléter la réponse de Sotorios Delimanolis.
C'est vrai que cela
ResponseEntity
vous donne plus de flexibilité, mais dans la plupart des cas, vous n'en aurez pas besoin et vous vous retrouverez avec ceux-ciResponseEntity
partout dans votre contrôleur, ce qui rendra difficile la lecture et la compréhension.Si vous souhaitez gérer des cas particuliers tels que des erreurs (non trouvé, conflit, etc.), vous pouvez ajouter un
HandlerExceptionResolver
à votre configuration Spring. Donc, dans votre code, vous lancez simplement une exception spécifique (NotFoundException
par exemple) et décidez quoi faire dans votre gestionnaire (en définissant le statut HTTP sur 404), ce qui rend le code du contrôleur plus clair.la source
Selon la documentation officielle: Création de contrôleurs REST avec l'annotation @RestController
Il semble qu'il soit préférable d'utiliser
@RestController
pour plus de clarté, mais vous pouvez également le combiner avecResponseEntity
pour plus de flexibilité si nécessaire ( selon le tutoriel officiel et le code ici et ma question pour le confirmer ).Par exemple:
est le même que:
De cette façon, vous ne pouvez définir
ResponseEntity
que lorsque cela est nécessaire.Mettre à jour
Vous pouvez utiliser ceci:
la source
@ResponseStatus(HttpStatus.OK)
ignoré lorsque vous revenezResponseEntity<>(user, responseHeaders, HttpStatus.NOT_FOUND)
. La réponse HTTP est404
Une API REST appropriée doit avoir les composants ci-dessous en réponse
Le principal objectif de ResponseEntity était de fournir l'option 3, les options de repos pouvaient être obtenues sans ResponseEntity.
Donc, si vous souhaitez indiquer l'emplacement de la ressource, il serait préférable d'utiliser ResponseEntity, sinon cela peut être évité.
Prenons un exemple où une API est modifiée pour fournir toutes les options mentionnées
Source - Le printemps en action
la source