Restituzione di più errori dal livello di servizio

6

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.

    
posta Goose 15.05.2014 - 10:20
fonte

1 risposta

1

Nella maggior parte delle lingue, le eccezioni sono classi che funzionano come qualsiasi altra classe. È possibile aggiungere proprietà o metodi a loro. Quindi, perché non consentire una struttura dati o anche un altro tipo di errore DTO o un elenco di errori DTO da passare nel costruttore di UnableToCreatePersonException ()? Potresti anche definire un'interfaccia come IMultipleErrorsException che alcune delle tue eccezioni implementano con un metodo come getAllErrors () che restituisce l'elenco degli errori DTO. Ogni DTO di errore potrebbe avere una chiave per una traduzione che contiene un messaggio di errore appropriato e la responsabilità del Controller si accerterà quindi che questi messaggi vengano restituiti all'utente nella lingua appropriata. Oppure il DTO potrebbe essere un tipo più sofisticato in grado di gestire la mappatura dalle eccezioni del livello di servizio ai campi e ai messaggi di errore.

    
risposta data 15.05.2014 - 16:51
fonte

Leggi altre domande sui tag