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);
}