フロントエンドの直接コピーがバックエンドで返されるエラーコードを示しているため、バックエンドは、エラーコードの国際化のために行われる必要があるので、最近の国際的なプロジェクトは、することができません。
実装プロセスにおける主な考慮事項は、次の2つの要件を満たすために:
1は、世界で非常に多くの言語ので、ので、新しい言語は、コードスケルトンを変更することなく、急速に増加することができます。
新しい、システム起動時にプロンプト/エラーに与えられるべきでない場合には、図2に示すように、新しいエラーコード、異なる言語の実装クラスは、同期エラーコードを追加する必要があります。
上記の二つの要件に基づいて、この要件を達成するためのプラントモデルを使用するのではと思いますが、実装プロセスは、次のカテゴリが含まれています。
LanguageErrorCodeService:エラーコード言語関連サービス・インターフェース。
AbstractLanguageErrorCodeService:抽象的な言語関連のエラーコードサービス・インターフェースの実装クラス。
LangErrorCodeFactory:工場出荷時のクラスの言語のエラーコードは、主な役割は、トラフィッククラスの言語で対応するプロセスを得ることです。
ErrorCodeEnum:エラーコードのすべての言語のエラーコードの列挙は、翻訳されたエラーコードのコピーを定義するには、この列挙に基づいています。
ChinaErrorCodeService、EngishErrorCodeService、GermanErrorCodeService:特定の言語のビジネスクラス
コードの構造:
以下は、特定の実装コードです:
パブリック インターフェースLanguageErrorCodeService { / ** * * @param用のerrorCodeエラー列挙 * @returnのエラーコードのコピー * / ストリングのgetMessage(ErrorCodeEnumのerrorCode); }
パブリック 抽象 クラス AbstractLanguageErrorCodeService 実装LanguageErrorCodeService、InitializingBean { @Override 公共 ボイド afterPropertiesSet()がスロー例外{ // サブクラスは脆弱性が忘れ定義された後に定義されたクラス症候群エラーコードは、それぞれの新しいエラーコードの定義を回避するのに十分です / / 全サブクラスエラーコードが設定されていない場合、ブートプロセス中にエラー。 ErrorCodeEnum []内=列挙型ErrorCodeEnum.values(); について:(ErrorCodeEnum errorCodeを列挙中){ IF(!HasErrorCode(errorCodeを)){ スロー 新しい新しい IllegalStateExceptionを(この。.getClass()getSimpleName()+ " 欠落している構成エラー国際MSG" ); } } } / ** *エラーコードかどうか * @param のerrorCode * @return * / 保護された 抽象 ブールhasErrorCode(ErrorCodeEnumのerrorCode); }
@Component パブリック クラス LangErrorCodeFactoryは実装ApplicationContextAware { プライベートのApplicationContextのApplicationContextを。 / ** *错误代码语言类 * @paramの言語语言 * @return * / パブリックLanguageErrorCodeService getLangErrorCode(文字列の言語){ 返す(言語LanguageErrorCodeService。applicationContext.getBeanをクラス) } パブリック文字列[] getAllService(){ 戻り applicationContext.getBeanNamesForType(LanguageErrorCodeService。クラス)。 } @Override 公共 ボイド setApplicationContext(ApplicationContextのApplicationContextの)はスローBeansException { この .applicationContext = のApplicationContextと、 } パブリック 静的 ボイドメイン(文字列[]引数){ ApplicationContextのアプリケーション = 新しい AnnotationConfigApplicationContext( "org.zhanglang.test.web.errorcode" )。 LangErrorCodeFactory langErrorCodeFactory = application.getBean(LangErrorCodeFactory クラス)。 ErrorCodeEnum passwordError = ErrorCodeEnum.PASSWORD_ERROR。 ために(文字列サービス:langErrorCodeFactory.getAllService()){ 文字列MSG = ((LanguageErrorCodeService)application.getBean(サービス))のgetMessage(passwordError)。 System.out.println(サービス + "さんERRORMSGがある「+ MSG)。 } } }
パブリック 列挙ErrorCodeEnum { SUCCESS( "0"、 "成功" )、 PASSWORD_ERROR( "001"、 "パスワードエラー" )、 OUT_OF_RETAY_TIMES( "002"、 "最大試行回数ログオン" )、 CHANGE_DEVICE( "003"、「置換機器「?); プライベートErrorCodeEnum(符号列、文字メッセージ){ この .CODE = コード; この .message = メッセージ; } プライベート文字コードと、 プライベート文字列メッセージ、 パブリックストリングにgetCode(){ 戻りコード; } 公共ストリングのgetMessage(){ リターン・メッセージ、 } }
@Service( "CN" ) パブリック クラス ChinaErrorCodeServiceは延び AbstractLanguageErrorCodeServiceが実装{LanguageErrorCodeServiceを @Override パブリック文字列のgetMessage(ErrorCodeEnumのerrorCode){ 戻りerrorCode.getMessageを(); } @Overrideは、 保護された ブールhasErrorCode(ErrorCodeEnumのerrorCode){ 戻り 真。 } }
@Service( "engish" ) パブリック クラス EngishErrorCodeServiceが延び AbstractLanguageErrorCodeServiceが実装LanguageErrorCodeServiceを{ プライベート 静的 最終地図<ErrorCodeEnum、文字列> codeMap = 新規 HashMapの<> (); 静的{ codeMap.put(ErrorCodeEnum.SUCCESS、 "成功" ); codeMap.put(ErrorCodeEnum.CHANGE_DEVICE、 "変更手段" )。 codeMap.put(ErrorCodeEnum.OUT_OF_RETAY_TIMES、 "再試行回数のうち。" ); codeMap.put(ErrorCodeEnum.PASSWORD_ERROR、「パスワードがエラーです。」); } @Override パブリック文字列のgetMessage(ErrorCodeEnumのerrorCode){ 文字列MSG = codeMap.get(のerrorCode)。 リターンMSG。 } @Overrideは、 保護された ブール{hasErrorCode(ErrorCodeEnumのerrorCode)を 返す(のerrorCode)codeMap.containsKeyと、 } }
次のような結果アウト操作LangErrorCodeFactoryコンソール印刷の主な方法、[OK]をクリックします。
1234 [メイン] INFO oscaAnnotationConfigApplicationContext -リフレッシュorg.springframework.context.annotation.AnnotationConfigApplicationContext@157632c9:起動日[月10月21日16時48分13秒CST 2019 ]; コンテキスト階層のルート 1399 [メイン] INFO osbfaAutowiredAnnotationBeanPostProcessor -発見し、サポートJSR-330「javax.inject.Inject」注釈のためにオートワイヤリング CNのERRORMSGは错误密码ある engishのERRORMSGは、パスワードが誤りです。 ドイツのERRORMSGはFehlerバイムPasswortです。