Internazionalizzazione su un livello di servizio di un'applicazione

2

Il mio problema specifico è come gestire l'internazionalizzazione di messaggi specifici da un livello di architettura che non è il livello di vista (ad es. livello di servizio).

Ho creato un'architettura basata sulla tecnologia da utilizzare (ad esempio jsf, primefaces, spring, postgres e mybatis). Quindi per evitare di riscrivere il codice ho definito un progetto come un jar (con Maven) che ha tutte le classi generiche (astratte) che si dovrebbero implementare (basate su interfacce). Qualcosa di simile (per farla breve mi concentrerò su una funzionalità e non aggiungerò le classi dao)

com.arch
 |_ service
 |   |_ GenericService.java
 |   |_ AbstractGenericServiceImpl.java
 |   |_ GenericServiceException.java
 |_ domain
 |   |_ GenericDomain.java
 |_ view
     |_ AbstractGenericManagedBean.java

Con questo in un file jar posso creare un'applicazione che astragga tutte le operazioni ripetitive come aggiungere, modificare, eliminare, elencare, ecc.

Nel mio AbstractGenericServiceImpl tutte le operazioni generano GenericServiceException con un messaggio basato sull'eccezione originale come questa:

@Override
public void add(E entity) throws D {
    try {
        getGenericDao().add(entity);
    } catch (DuplicateKeyException ex) {
        throw getNewException("Duplicate registry. Can not add.");
    }
}

Questa è solo una delle molte eccezioni che catturo e tiro come GenericServiceException .

Quindi nella mia applicazione web ho tutta la struttura necessaria per gestire l'internazionalizzazione, in quanto le specifiche JSF 2.x raccomandano il pacchetto i18n con i file delle proprietà, ad es. (messages.properties, messages_en.properties, messages_pt_BR.properties e così via.) ed è configurato su faces-config.xml funziona tutto bene PER I MIEI file XHTML ma per quanto riguarda i miei file di servizio che sono disaccoppiati dalla mia app web? Come posso cambiare i miei messaggi da getNewException("Duplicate registry. Can not add.") a qualcosa di simile a

getNewException(WebAppChoosedLanguage.getMessage(WebAppMessages.DUPLICATE_REGISTRY))

È un buon approccio o dovrei lasciare che il servizio generico lanci sempre tutte le eccezioni che devono essere gestite dai bean gestiti che hanno chiamato il servizio?

Te lo chiedo perché ogni domanda che trovo al riguardo parla solo sul livello vista.

Codice per il metodo getNewException :

private D getNewException(String message) {
    try {
        ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
        Class<D> theType = (Class<D>) type.getActualTypeArguments()[2];
        Constructor<D> constructor = theType.getConstructor(String.class);
        return constructor.newInstance(message);
    } catch (NoSuchMethodException | SecurityException 
                 | InstantiationException 
                 | IllegalAccessException 
                 | IllegalArgumentException
                 | InvocationTargetException e) {
        logger.error("Erro ao executar o reflection para exceção. " + e.getMessage());
    }
    return null;
}
    
posta Jorge Campos 15.04.2015 - 21:25
fonte

1 risposta

2

Il tipo di eccezione che viene lanciata dovrebbe non essere specifico per il dominio della lingua umana.

Crea un'eccezione denominata in inglese e cerca una stringa internazionalizzata per la descrizione dell'eccezione.

    
risposta data 15.04.2015 - 23:42
fonte

Leggi altre domande sui tag