2016-03-30 15 views
0

Ich arbeite an der Entwicklung von RESTful Service auf Java mit Spring Framework. Wenn in meiner Dienstebene eine Ausnahme auftritt, werfe ich eine Ausnahme aus, die an den HTTP-Statuscode gebunden ist. Wenn beispielsweise die Authentifizierung des Benutzers fehlschlägt, sende ich eine Antwort mit dem Statuscode 401.Wie kann ich benutzerdefinierte Antwortphrase mit Spring-Framework festlegen?

return new ResponseEntity<>(HttpStatus.valueOf(statusCode)); 

Ich mag RESTful Service Verbraucher erklären, was mit seiner Bitte nicht nur den Code zu senden falsch ist, sondern auch textliche Erklärung. Ich kann dies entweder tun, indem ich eine benutzerdefinierte Nachricht zum Antworthauptteil hinzufüge, oder indem ich die Standardantwortphrase ersetze. Zum Beispiel ersetzen Sie Unauthorized für 401 durch User does not exist oder Incorrect password.

Das Problem ist HttpStatus von org.springframework.http ist enum und Fehlercodes sind an textliche Antwort Phrasen gebunden.

Kann ich diese Antwortphrasen irgendwie überschreiben oder brauche ich einen anderen Ansatz?

Und ist es gute Praxis, Standardantwortausdruck zu ersetzen, oder es wäre besser, Erklärungsnachricht zu Antwortkörper zu setzen?

+0

Ich habe versucht, 'HttpServletResponse' zu ​​verwenden, gibt es' setStatus (int sc, String sm) 'Methode, aber leider funktioniert es nicht wie ich es erwarte und es ist auch veraltet. Wenn ich versuche, es zu verwenden, ändert es die Standardantwortphrase für vorhandenen Code nicht und fügt meinem benutzerdefinierten Code keine Nachricht hinzu, zB 488. Es wird empfohlen, 'sendError (int sc, String msg)' zu verwenden, aber auch ändert die Antwortphrase nicht. Es fügt nur spezifizierte Nachricht Servlet Container Standard-HTML-Fehler Seite :( – Derp

Antwort

0

sollte diese Arbeit:

Zuerst es produziert die Request-Methode auf den Typ kann gebunden durch produces = {MediaType.TEXT_PLAIN} zu Ihrem @RequestMapping Hinzufügen wo Media von Import javax.ws.rs.core.MediaType dies wird Text Ebene Antwort erzeugen.

Dann können Sie Folgendes zurückgeben: return new ResponseEntity<>(message, HttpStatus.UNAUTHORIZED); wo Nachricht die Textnachricht ist, die Sie anzeigen möchten.

+0

Dies wird Nachricht zu Antwort Körper, nicht Header. – Derp

+0

Ich habe nicht bemerkt, Sie wollten als Header. ResponseEntity Konstruktor kann HttpHeaders haben, wie Sie in der [API sehen können ] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html), aber ich denke nicht, dass es eine gute Methode ist, HTTP-Code-Nachrichten zu überschreiben, da HTTP ist ein Standard Ich würde tun, was ich zu Ihnen zeigte, oder ich würde eine neue Überschrift definieren, die Ihre Anwendung lesen und anzeigen könnte: HttpHeaders myHeaders = new HttpHeaders(); myHeaders.set ("MyResponseHeader", "MyValue"); Rückgabe neuer ResponseEntity <> ("", myHeaders, HttpStatus.UNAUTHORIZED); – Hellzzar