452 votes

Comment réagir avec l’erreur HTTP 400 une Spring MVC @ResponseBody retour par la méthode String ?

Je suis à l'aide de Spring MVC pour une simple API JSON, @ResponseBody base comme suit. (J'ai déjà un service à la couche de la production de JSON directement.)

@RequestMapping(value = "/matches/{matchId}", produces = "application/json")
@ResponseBody
public String match(@PathVariable String matchId) {
    String json = matchService.getMatchJson(matchId);
    if (json == null) {
        // TODO: how to respond with e.g. 400 "bad request"?
    }
    return json;
}

La Question est, dans le scénario, ce qui est le plus simple, la façon la plus propre à réagir avec une erreur HTTP 400?

Je suis nouveau sur Spring MVC, et cela s'est avéré quelque peu non-évident... je l'ai fait venir à travers des approches comme:

return new ResponseEntity(HttpStatus.BAD_REQUEST);

...mais je ne peux pas l'utiliser ici depuis mon retour de la méthode est de type String, pas ResponseEntity.

711voto

Bobo Zohdy Points 1771

changer votre type de retour à `` , alors vous pouvez utiliser ci-dessous pour 400

et pour corriger la demande

118voto

stacker Points 34209

Quelque chose comme cela devrait fonctionner, je ne suis pas sûr qu’il y a un moyen plus simple ou non :

57voto

Zutty Points 2733

N’est pas nécessairement le plus compact moyen de le faire, mais tout à fait propre IMO

Edit, vous pouvez utiliser @ResponseBody dans la méthode de gestionnaire d’exception si vous utilisez printemps 3.1 +, sinon utilisez une `` ou quelque chose.

https://JIRA.SpringSource.org/Browse/SPR-6902

51voto

matsev Points 6761

Je voudrais changer la mise en œuvre légèrement:

Tout d'abord, j'ai créer un UnknownMatchException:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class UnknownMatchException extends RuntimeException {
    public UnknownMatchException(String matchId) {
        super("Unknown match: " + matchId);
    }
}

Notez l'utilisation de @ResponseStatus, qui sera reconnu par le Printemps de l' ResponseStatusExceptionResolver. Si l'exception est levée, il va créer une réponse correspondant à l'état de réponse. (J'ai aussi pris la liberté de modifier le code de statut" 404 - Not Found que je trouve plus approprié pour ce cas d'utilisation, mais vous pouvez vous en tenir à l' HttpStatus.BAD_REQUEST si vous le souhaitez).


Ensuite, je voudrais changer l' MatchService d'avoir la signature suivante:

interface MatchService {
    public Match findMatch(String matchId);
}

Enfin, je voudrais mettre à jour le contrôleur et délégué du Printemps, MappingJackson2HttpMessageConverter pour gérer la sérialisation JSON automatiquement (il est ajouté par défaut si vous ajoutez Jackson pour le classpath et ajouter @EnableWebMvc ou <mvc:annotation-driven /> de votre config, voir la référence docs):

@RequestMapping(value = "/matches/{matchId}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Match match(@PathVariable String matchId) {
    // throws an UnknownMatchException if the matchId is not known 
    return matchService.findMatch(matchId);
}

Remarque, il est très commun de séparer les objets du domaine à partir de la vue des objets ou des DTO objets. Cela peut facilement être réalisé en ajoutant un petit DTO usine qui renvoie la sérialisation d'objet JSON:

@RequestMapping(value = "/matches/{matchId}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public MatchDTO match(@PathVariable String matchId) {
    Match match = matchService.findMatch(matchId);
    return MatchDtoFactory.createDTO(match);
}

-1voto

Ryan S Points 62

Je pense que ce fil a fait la solution plus simple, plus propre, qui ne sacrifie pas les outils de martialing JSON qui offre de printemps :

http://StackOverflow.com/a/16986372/1278921

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X