Sto utilizzando Spring per l'input e la convalida del modulo. Il comando del modulo di controllo contiene il modello che si sta modificando. Alcuni degli attributi del modello sono di tipo personalizzato. Ad esempio, il numero di previdenza sociale della persona è un tipo SSN personalizzato.Convalida della primavera, come fare in modo che PropertyEditor generi un messaggio di errore specifico
public class Person {
public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
e avvolgente Persona in una forma comando Primavera edit:
public class EditPersonCommand {
public Person getPerson() {...}
public void setPerson(Person person) {...}
}
Dalla primavera non sa come convertire testo in uno SSN, registro un editor di cliente con legante del controller modulo:
public class EditPersonController extends SimpleFormController {
protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) {
super.initBinder(req, binder);
binder.registerCustomEditor(SSN.class, "person.ssn", new SsnEditor());
}
}
e SsnEditor è solo una consuetudine java.beans.PropertyEditor
che può convertire il testo in un oggetto di SSN:
public class SsnEditor extends PropertyEditorSupport {
public String getAsText() {...} // converts SSN to text
public void setAsText(String str) {
// converts text to SSN
// throws IllegalArgumentException for invalid text
}
}
Se setAsText
incontri testo che non è valido e non può essere convertito in uno SSN, poi si getta IllegalArgumentException
(per PropertyEditor
setAsText
s' specifica). Il problema che sto avendo è che la conversione da testo a oggetto (tramite PropertyEditor.setAsText()
) ha luogo prima del viene chiamato il mio validatore Spring. Quando setAsText
genera IllegalArgumentException
, Spring visualizza semplicemente il messaggio di errore generico definito in errors.properties
. Quello che voglio è un messaggio di errore specifico che dipende dal motivo esatto per cui il SSN inserito non è valido. PropertyEditor.setAsText()
determinerebbe il motivo. Ho provato a incorporare il testo del motivo dell'errore nel testo di IllegalArgumentException
, ma Spring lo tratta semplicemente come un errore generico.
C'è una soluzione a questo? Per ripetere, ciò che voglio è lo specifico messaggio di errore generato dallo PropertyEditor
da far apparire sul messaggio di errore nel modulo Spring. L'unica alternativa che posso pensare è di memorizzare l'SSN come testo nel comando ed eseguire la convalida nel validatore. Il testo per la conversione degli oggetti SSN avverrà nel formato onSubmit
. Questo è meno desiderabile in quanto la mia forma (e il modello) ha molte proprietà e non voglio dover creare e mantenere un comando che ha ogni attributo di modello come un campo di testo.
Quanto sopra è solo un esempio, il mio codice reale non è Persona/SSN, quindi non c'è bisogno di rispondere con "Perché non conservare SSN come testo ..."
@Steve Kuo Aggiunto alla risposta originale –