2010-11-17 11 views
8

In primavera, dopo la convalida otteniamo un oggetto nello controller.Spring: Come risolvere un errore di convalida -> codice di errore -> messaggio di errore

Abbastanza semplice, se ricevo errori di convalida, voglio rivedere il mio modulo con il messaggio di errore sopra ogni campo afflitto.

Quindi, per verificare la presenza di errori sul campo sul campo username della mia FormObject mi chiamano:

FieldError usernameFieldError = bindingResult.getFieldError("username"); 

Grande, ora ho in possesso di un oggetto FieldError che, assumendo sto usando il DefaultMessageCodeResolver ora contiene qualcosa come 4 errore possibile codici.

Come passare da FieldError -> Una stringa che è consumabile per l'utente?

Ho un MessageSource definito nel mio contesto di applicazione web, quindi posso mappare un singolo codice di errore in un messaggio.

Ma a volte il messaggio predefinito sarà il migliore, ea volte mi aspetto che due dei codici di errore possano avere un messaggio rilevante, quindi dobbiamo scegliere quello migliore.

Quale metodo si utilizza per determinare il migliore messaggio di errore possibile da presentare per un errore di campo?

  • Devo scrivere qualche algoritmo per passare attraverso tutti i codici di errore e scegliere tra i più specifici?
  • Spring fornisce supporto per determinare il messaggio di errore più specifico?
  • Questo intero processo sembra così lungo e contorto, pensavo che la primavera avrebbe dovuto rendere questa roba facile. Forse sono totalmente fuori base in qualche modo?

risposta

15

Sei, come hai indovinato, rendendo molto più difficile per te stesso di quanto debba essere. L'oggetto FieldError è esso stesso un MessageSourceResolvable. Non è necessario che i codici vengano cancellati, quindi portare i codici individuali manualmente alla fonte dei messaggi e andare a cercare. Puoi semplicemente passarlo al tuo MessageSource e troverà quello più specifico che ha una traduzione definita nella tua locale. (supponendo che il tuo risolutore di codici li metta nell'ordine giusto.)

Nella realtà non è nemmeno necessario farlo nella maggior parte dei casi. Di solito non è necessario mettere il Errors sul tuo oggetto di supporto e tradurlo da solo. Lo spazio dei nomi form nella libreria jsp fornisce un tag che cerca i messaggi di errore. Tutto ciò che devi fare è inserire lo Errors nel ModelMap. Vedi docs:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/view.html#view-jsp-formtaglib-errorstag

+0

Oooh, vedo, io non prendo MessageSource.get (MessageSoureResolvable, ...), ho appena notato il get (String, ...) le opzioni, questa è la chiave di collegamento (in realtà probabilmente l'ho notato e l'ho perso nella miriade di dettagli in cui ci perdiamo quando impariamo un nuovo framework/api). Grazie!! –

+0

Punto interessante sul taglib JSP, sto usando Velocity, ma Spring offre lo stesso in formato macro. Ma non l'ho ancora impiegato poiché sembrava piuttosto anti-primavera legare anche la mia presentazione alla struttura della primavera. Ho pensato che fosse abbastanza brutto che il mio controller ora chiamasse il MessageSource specifico per la primavera piuttosto che un ResourceBundle standard java.Ma forse lo sto pensando troppo? È la mia prima volta con Spring. –

+1

Abbastanza vero, ma per quanto riguarda le tecnologie di visualizzazione, in genere finirai per accoppiarlo a * qualcosa. * Farai un sacco di reinventare la ruota se tenti di utilizzare solo JSTL e l'API del servlet! WebMVC e WebFlow sono abbastanza non invadenti, e con le librerie di tag è possibile creare facilmente i propri file .tag che li avvolgono e "isolano" la dipendenza in un unico posto che l'implementazione potrebbe successivamente essere modificata. L'uso del tag rimuove anche la dipendenza dall'interfaccia Errori nel tuo oggetto di backup, permettendoti di usare un pojo senza molla. – Affe

Problemi correlati