Sine si sta Desigining un API REST, è necessario creare il proprio Pojo (aka. Resource) che rappresenterà gli errori di comportamento o di convalida dispari, come affermato da horaceman. Ti mostrerò come lo facciamo nella nostra applicazione.
Poiché utilizziamo JSON come rappresentazione di dati, desideriamo ricevere le seguenti informazioni se si verificano eccezioni impreviste.
{ "status" : "EXCEPTION", "exceptionName" : "MyCustomException", "exceptionMsg" : "ex.unsupportedOperation" }
Questo è un esempio ovviamente. Una buona soluzione è che possiamo trattare exceptionMsg
come chiave nel nostro frontend per visualizzare il messaggio corretto i18n
o visualizzarlo all'utente così com'è (in questo caso usiamo messaggi più descrittivi).
Ora, quando tutto va bene facciamo qualcosa di simile:
{ "status" : "OK", "data" : {(...)} }
Data
elemento è opzionale. Possiamo inviare qualsiasi cosa di cui abbiamo bisogno per notificare il frontend, o saltarlo completamente.
L'ultimo scenario sarebbe tuo - errori di convalida. In questo caso trasmettiamo solitamente seguente contenuto:
{ "status" : "VALIDATION_FAILED", "errors" : [ "fieldName" : "username", "errorCode" : "validation.requiredField", "errorMsg" : "Username is required."] }
così chiaramente client API riceveranno informazioni che la validazione ha fallito e nei campi appropriati - dettagli esatti su cosa è andato storto. Ovviamente errors
è un array (o List
), quindi forniamo sempre tutti i dettagli necessari.
Come faccio? Facile, questi oggetti sono semplici POJOS che vengono tradotti in JSON usando Jackson. Questo mi dà possibilità illimitate di rappresentazione JSON. Quello che faccio è che sto preparando POJO che rappresenta gli errori di convalida (ad esempio) e lo aggiungo come alla mia istanza ModelAndView
. Quindi mi baso su Spring per fare il corretto marshalling JSON.
Nel tuo caso hai l'annotazione @ResponseBody
con l'istanza Post
, quindi per quanto ne so non potrai farlo. Il tuo setup sta dicendo "Beh, non importa cosa succede, restituisci sempre un'istanza di Post". Quello che dovresti fare è sostituirlo con il semplice ModelAndView
, fornirlo con il corretto Model
in base alla convalida e restituirlo all'API del client.
Stai progettando API o gestione modulo? –
Sto progettando un'API REST. –