it-swarm-ja.com

アプリケーションのサービス層での国際化

私の特定の問題は、ビューレイヤー(サービスレイヤーなど)ではないアーキテクチャレイヤーからの特定のメッセージの国際化をどのように処理するかです。

使用するテクノロジー(jsf、primefaces、spring、postgres、mybatisなど)に基づいてアーキテクチャを作成しました。したがって、コードの書き換えを避けるために、プロジェクトを、(インターフェイスに基づいて)実装する必要のあるすべての汎用(抽象)クラスを持つjar(mavenを使用)として定義しました。のようなもの(短くするために、1つの機能に焦点を合わせ、daoクラスを追加しません)

_com.Arch
 |_ service
 |   |_ GenericService.Java
 |   |_ AbstractGenericServiceImpl.Java
 |   |_ GenericServiceException.Java
 |_ domain
 |   |_ GenericDomain.Java
 |_ view
     |_ AbstractGenericManagedBean.Java
_

これをjarファイルに入れると、追加、編集、削除、一覧表示などの反復操作をすべて抽象化するアプリケーションを作成できます。

私のAbstractGenericServiceImplでは、すべての操作でGenericServiceExceptionがスローされ、次のような元の例外に基づいたメッセージが表示されます。

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

これは、私がGenericServiceExceptionとしてキャッチしてスローする多くの例外の1つにすぎません。

したがって、私のWebアプリケーションでは、国際化を処理するために必要なすべての構造があります。JSF2.x仕様では、プロパティファイルを含むi18nパッケージが推奨されています。 (messages.properties、messages_en.properties、messages_pt_BR.propertiesなど)そしてそれはfaces-config.xmlで構成されており、すべて私のXHTMLファイルで正常に機能しますが、私のWebアプリから切り離されているサービスファイルはどうですか?メッセージをgetNewException("Duplicate registry. Can not add.")から次のようなものに変更するにはどうすればよいですか。

_getNewException(WebAppChoosedLanguage.getMessage(WebAppMessages.DUPLICATE_REGISTRY))
_

これは良いアプローチですか、それとも汎用サービスがサービスを呼び出したマネージドBeanによって処理されるすべての例外を常にスローするようにする必要がありますか?

私がそれについて見つけたすべての質問はビューレイヤーでしか話さないので、私はこれを尋ねています。

メソッド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;
}
_
2
Jorge Campos

スローされる例外のタイプは人間の言語ドメインに固有ではありません。

英語で名前が付けられたいくつかの例外をスローし、例外の説明について国際化された文字列を検索します。

2
Robert Harvey