Ich würde die Implementierung leicht ändern:
Zuerst erstelle ich eine UnknownMatchException
:
@ResponseStatus(HttpStatus.NOT_FOUND)
public class UnknownMatchException extends RuntimeException {
public UnknownMatchException(String matchId) {
super("Unbekanntes Match: " + matchId);
}
}
Beachten Sie die Verwendung von @ResponseStatus, das vom ResponseStatusExceptionResolver
von Spring erkannt wird. Wenn die Ausnahme ausgelöst wird, wird eine Antwort mit dem entsprechenden Antwortstatus erstellt. (Ich habe auch die Freiheit genommen, den Statuscode auf 404 - Not Found
zu ändern, was ich für diesen Anwendungsfall angemessener finde, aber Sie können sich auch für HttpStatus.BAD_REQUEST
entscheiden, wenn Sie möchten.)
Dann würde ich die Signatur des MatchService
ändern, um folgendes zu haben:
Schnittstelle MatchService {
public Match findMatch(String matchId);
}
Zuletzt würde ich den Controller aktualisieren und Spring's MappingJackson2HttpMessageConverter
verwenden, um die JSON-Serialisierung automatisch zu handhaben (es wird standardmäßig hinzugefügt, wenn Sie Jackson zum Klassenpfad hinzufügen und entweder @EnableWebMvc
oder zu Ihrer Konfiguration hinzufügen. Siehe die Referenzdokumentation):
@RequestMapping(value = "/matches/{matchId}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Match match(@PathVariable String matchId) {
// Wirft eine UnknownMatchException, wenn die matchId nicht bekannt ist
return matchService.findMatch(matchId);
}
Bemerkenswert ist, dass es sehr üblich ist, die Domänenobjekte von den View-Objekten oder DTO-Objekten zu trennen. Dies kann leicht durch Hinzufügen einer kleinen DTO-Fabrik erreicht werden, die das serialisierbare JSON-Objekt zurückgibt:
@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);
}