365 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.

587voto

Bobo Zohdy Points 1771
<p>changer votre type de retour à <code></code> , alors vous pouvez utiliser ci-dessous pour 400<pre><code></code></pre><p>et pour corriger la demande</p><pre><code></code></pre></p>

99voto

stacker Points 34209
<p>Quelque chose comme cela devrait fonctionner, je ne suis pas sûr qu’il y a un moyen plus simple ou non :<pre><code></code></pre></p>

53voto

Zutty Points 2733
<p>N’est pas nécessairement le plus compact moyen de le faire, mais tout à fait propre IMO<pre><code></code></pre><p>Edit, vous pouvez utiliser @ResponseBody dans la méthode de gestionnaire d’exception si vous utilisez printemps 3.1 +, sinon utilisez une <code></code> ou quelque chose.</p><p><a href="https://jira.springsource.org/browse/SPR-6902">https://JIRA.SpringSource.org/Browse/SPR-6902</a></p></p>

47voto

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
<p>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 :</p> <p><a href="http://stackoverflow.com/a/16986372/1278921">http://StackOverflow.com/a/16986372/1278921</a></p>

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