Sto usando Spring per un'applicazione web. Per convalidare l'input di un utente in un modulo come per la creazione di un'entità Person, utilizzo la convalida JSR 303 per verificare la presenza di pattern non nulli / vuoti o validi ecc. Alcune cose tuttavia effettuo il check-in del livello di servizio, ad esempio assicurandomi che un campo sia univoco nel database e se non lanciare un'eccezione. Cattura questa eccezione nel controller e aggiungo un errore al campo.
Questo è fondamentalmente ciò che sta facendo Ben J nell'opzione 1 qui link
Livello di servizio
public Person createPerson(String username, String fullName, String specialCode)
throws DuplicateUsernameException {
// Check if username exists and throw exception otherwise create person.
if (checkUsernameExists(username)) {
throw new DuplicateUsernameException();
}
Person person = new Person(username, fullName, specialCode);
return personDao.create(person);
}
Regolatore
void createPerson(Form form, Errors errors) {
try {
service.createPerson(form.getUsername(), form.getFullName(),
form.getSpecialCode());
} catch (DuplicateUsernameException e) {
errors.add("username", "This username exists");
}
// render view
...
}
Fino ad ora questo mi è stato utile, ma ora ho l'obbligo di verificare che due campi siano individualmente unici e che vogliano informare l'utente. Nell'esempio precedente, se volevo controllare che lo specialCode fosse anche unico, potrei aggiungere un altro controllo sotto quello esistente nel livello di servizio e lanciare una DuplicateSpecialCodeException separata.
Livello di servizio
public Person createPerson(String username, String fullName, String specialCode)
throws DuplicateUsernameException, DuplicateSpecialCodeException {
if (checkUsernameExists(username)) {
throw new DuplicateUsernameException();
}
if (checkSpecialCodeExists(specialCode)) {
throw new DuplicateSpecialCodeException();
}
Person person = new Person(username, fullName, specialCode);
return personDao.create(person);
}
Regolatore
void createPerson(Form form, Errors errors) {
try {
service.createPerson(form.getUsername(), form.getFullName(),
form.getSpecialCode());
} catch (DuplicateUsernameException e) {
errors.add("username", "This username exists");
} catch (DuplicateSpecialCodeException e) {
errors.add("specialCode", "This special code exists");
}
// render view
...
}
Il problema è che se l'utente invia un nome utente duplicato e un codice speciale duplicato, verranno informati solo del nome utente duplicato. Voglio mostrare entrambi i campi.
Che cos'è un modo accurato per fare ciò?
Le mie idee finora sono:
- Genera un'eccezione che contiene tutti gli errori.
- Passa l'oggetto Errors al servizio e aggiungi errori a questo.
Entrambi questi metodi farebbero affidamento sul livello di servizio conoscendo il nome dei campi e un codice di errore adatto che sembra andare contro mantenendo separati i livelli.