Publié le 06/01/2017, rédigé par Chloé MAHALIN

Spring

Gérer différents code de retour HTTP dans Spring MVC

Avec Spring MVC, on peut gérer les codes retour très simplement avec l'annotation @ResponseStatus qui permet de définir un code retour à chaque requête :

@RestController
@RequestMapping("/api/entity")
public class EntityController {

    @Autowired
    private EntityService entityService;

    @RequestMapping(value = "/get/{id}", method = GET, produces = {MediaType.APPLICATION_JSON_VALUE})
    @ResponseStatus(value = HttpStatus.OK)
    public List<Entity> get(@PathVariable("id") String id) {
        LOGGER.info("Search entity by Id : {}", id);

        return this.entityService.get(id);
    }
}

Mais parfois, on souhaite distinguer plusieurs cas de gestion lors d'une réponse. Et l'on est alors susceptible de devoir retourner plusieurs code statut HTTP différents. L'usage de la classe ResponseEntity permet de répondre une valeur générique mais différente pour chacun des cas. Elle évite notamment de devoir créer sa propre classe Response :

@RestController
@RequestMapping("/api/entity")
public class EntityController {

    @Autowired
    private EntityService entityService;

    @RequestMapping(value = "/get/{id}", method = GET, produces = {MediaType.APPLICATION_JSON_VALUE})
    @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity get(@PathVariable("id") String id) {
        LOGGER.info("Search entity by Id : {}", id);

        if(id != null) {

            return new ResponseEntity<>(this.entityService.get(id), HttpStatus.OK);

        }
        else {

            LOGGER.info("An attempt to get en entity with null id has be identified.");
            return new ResponseEntity<>(this.entityService.get(id), HttpStatus.NO_CONTENT);
        }
    }
}