検索
ホームページJava&#&チュートリアルSpring Boot で例外メッセージのローカライゼーションを処理する最良の方法

Best Way to Handle Localization For Exception Messages in Spring Boot

アプリケーションが世界中のユーザーにサービスを提供できるように成長するにつれて、ローカリゼーションはソフトウェア開発の重要な側面になります。ローカリゼーションにより、アプリケーションがさまざまな言語や地域に適応できるようになり、ユーザー フレンドリーなエクスペリエンスが提供されます。 

この記事では、Spring Boot アプリケーションでローカライズされた例外を処理する私のお気に入りの方法を共有します。

例外メッセージのローカリゼーションが必要な理由

バックエンド側での例外メッセージのローカライズは、特に世界中のユーザーを対象とするアプリケーションでシームレスなユーザー エクスペリエンスを作成するために不可欠です。 

これらのメッセージをバックエンドでローカライズし、フロントエンドに直接送信することで、フロントエンド開発者の肩から複数の言語を管理する責任を負うことができます。このアプローチにより、エラー メッセージがすべてのプラットフォームおよび言語で一貫していることが保証され、フロントエンド開発者はエラー トーストなどでこれらのメッセージをユーザー フレンドリーな方法で表示することに集中できるようになります。 

その結果、フロントエンドで各言語のカスタム例外メッセージを処理する必要がなくなり、作業の重複やエラーの可能性が減り、すべてのユーザーが明確で適切なフィードバックを希望する言語で確実に受け取ることができます。

バックエンドで目標を簡単に達成するにはどうすればよいでしょうか?

目標を達成するには、以下の手順に従ってください。 

一般例外クラス

まず、RuntimeException を拡張するクラスを作成し、それに ResponseException という名前を付けます。このカスタム例外を使用すると、アプリケーション固有のエラーをより制御された方法で処理できるようになります。

public class ResponseException extends RuntimeException {

}

応答エラークラス

例外が発生したときに応答で返される別のクラスを作成します。このクラスには、メッセージ、タイムスタンプ、errorCode、およびフロントエンドに渡したいその他の関連情報などのフィールドを含めることができます。

public record ErrorResponse(int status, String message) {

}

グローバル例外ハンドラ

Spring の @ControllerAdvice アノテーションを使用して GlobalExceptionHandler を実装します。このクラスでは、ResponseException をキャッチし、ユーザーのロケールに基づいて適切なローカライズされたメッセージにマッピングできます。

@Slf4j
@RestControllerAdvice
@RequiredArgsConstructor
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

  @ExceptionHandler(value = ResponseException.class)
  public ResponseEntity<errorresponse> handleResponseStatusException(
      ResponseException ex
  ) {
    log.error("ResponseException: {}", ex.getMessage());

    String message = ex.getMessage();

    var errorResponse = new ErrorResponse(ex.getStatus().value(), message);

    return new ResponseEntity(errorResponse, ex.getStatus());
  }
}
</errorresponse>

言語固有のプロパティ ファイル

ローカライズされたメッセージを管理するには、サポートされている言語ごとにプロパティ ファイルを作成します (英語の場合はmessages_en.properties、アゼルバイジャン語の場合はmessages_az.propertiesなど)。これらのファイルには、各例外メッセージのキーと値のペアが含まれており、Spring がユーザーのロケールに基づいて正しいメッセージを自動的に解決できるようになります。

これらのプロパティ ファイルを src/main/resources フォルダーに作成します。

err.username_already_exists.msg=User with username: {0} is already exists.

ローカリゼーション部分の実装

Spring Boot で例外を処理するための最低限のものを作成しました。上記についてはすでにご存知かと思います。引き続き翻訳部分を追加してみましょう。

ResponseException クラスを変更します:

public class ResponseException extends RuntimeException {
  private final String messageTemplate;
  private final transient Object[] params;
  private final Locale locale;

  public static ResponseException notFound(String messageTemplate, Locale locale) {
    return new ResponseException(HttpStatus.NOT_FOUND, messageTemplate, null, locale);
  }

  public static ResponseException notFound(String messageTemplate, Object[] params, Locale locale) {
    return new ResponseException(HttpStatus.NOT_FOUND, messageTemplate, params, locale);
  }

  public static ResponseException forbidden(String messageTemplate, Locale locale) {
    return new ResponseException(HttpStatus.FORBIDDEN, messageTemplate, null, locale);
  }

  public static ResponseException forbidden(String messageTemplate, Object[] params, Locale locale) {
    return new ResponseException(HttpStatus.FORBIDDEN, messageTemplate, params, locale);
  }  
}

NOT_FOUNDFORBIDDEN など、頻繁に使用される HttpStatus コードのヘルパー メソッドを作成します。

これらのヘルパー メソッドは次の方法で使用できます:

// some code parts omitted ...
userService.findByUsername(username)
  .orElseThrow(() -> ResponseException.notFound("user_not_found", locale))

すべてのプロパティ ファイルに user_not_found メッセージ テンプレートを作成します。

// file: messages_en.properties
user_not_found=User not found

// file: messages_az.properties
user_not_found=İsdifadəçi tapılmadı

これらを自動的に置き換えるには、フロントエンドに戻る前に GlobalExceptionHandler クラスのメソッドを更新します。

@Slf4j
@RestControllerAdvice
@RequiredArgsConstructor
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

  private final MessageSource messageSource;

  @ExceptionHandler(value = ResponseException.class)
  public ResponseEntity<errorresponse> handleResponseStatusException(
      ResponseException ex
  ) {
    log.error("ResponseException: {}", ex.getMessage());

    String message = ex.getMessage();

    String messageTemplate = ex.getMessageTemplate();
    if (StringUtils.isNotBlank(messageTemplate)) {
      message = messageSource.getMessage(messageTemplate, ex.getParams(), ex.getLocale());
    }

    var errorResponse = new ErrorResponse(ex.getStatus().value(), message);

    return new ResponseEntity(errorResponse, ex.getStatus());
  }
}
</errorresponse>

例外メッセージで動的値を使用する方法

この例外処理方法は、例外メッセージに動的な値を設定する必要がある場合に特に便利です。たとえば、

// file: messages_en.properties
err.invalid_phone_number.msg=The phone: {0} is invalid

{0} を動的な値に置き換えるため。

public static ResponseException badRequest(
      String messageTemplate, 
      Locale locale,
      String... params
) {
  return new ResponseException(
        HttpStatus.BAD_REQUEST, 
        messageTemplate, 
        params, 
        locale
  );
}

毎回新しいメソッドを作成せずに複数の動的パラメータを渡すために、varargs パラメータを最後に置きました。

動的値を含むメッセージに関する専用の記事があります。

ユーザーのロケールはどこで取得できますか?

ロケールを取得するには 2 つの方法があります:

  1. UI 設定に基づいてデータベースに保存されるユーザーのロケール。

  2. 一部のコントローラー メソッドは、オプションの lang リクエスト パラメーターを受け入れます。これは、フロントエンド開発者が UI がさまざまな言語でどのようになるかを確認したい場合のテストに役立つ可能性があります。なぜなら、各言語の文の長さは同じではないからです。

結論

今日はここまでです。楽しんでいただければ幸いです。

ソース コードは、私の GitHub アカウントのリポジトリで利用できます。

ご質問がございましたら、LinkedIn 経由でお気軽にお問い合わせください。

以上がSpring Boot で例外メッセージのローカライゼーションを処理する最良の方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
プラットフォームの独立性のためにネイティブコードを介してbytecodeを使用することの利点は何ですか?プラットフォームの独立性のためにネイティブコードを介してbytecodeを使用することの利点は何ですか?Apr 30, 2025 am 12:24 AM

bytecodeachievesplatformedentencedexedectedbyavirtualMachine(VM)、forexApplev.forexample、javabytecodecanrunrunrunnonydevicewithajvm、writeonce、runany "ferfuctionality.whilebytecodeOffersenhの可能性を承認します

Javaは本当に100%プラットフォームに依存していませんか?なぜまたはなぜですか?Javaは本当に100%プラットフォームに依存していませんか?なぜまたはなぜですか?Apr 30, 2025 am 12:18 AM

Javaは100%のプラットフォームの独立性を達成することはできませんが、そのプラットフォームの独立性はJVMとBytecodeを通じて実装され、コードが異なるプラットフォームで実行されるようにします。具体的な実装には、次のものが含まれます。1。bytecodeへのコンパイル。 2。JVMの解釈と実行。 3。標準ライブラリの一貫性。ただし、JVMの実装の違い、オペレーティングシステムとハードウェアの違い、およびサードパーティライブラリの互換性は、プラットフォームの独立性に影響を与える可能性があります。

Javaのプラットフォーム独立性は、コードの保守性をどのようにサポートしますか?Javaのプラットフォーム独立性は、コードの保守性をどのようにサポートしますか?Apr 30, 2025 am 12:15 AM

Javaは、「Write onse、Averywhere」を通じてプラットフォームの独立性を実現し、コードの保守性を向上させます。 2。メンテナンスコストが低いため、1つの変更のみが必要です。 3.チームのコラボレーション効率が高く、知識共有に便利です。

新しいプラットフォームのJVMを作成する際の課題は何ですか?新しいプラットフォームのJVMを作成する際の課題は何ですか?Apr 30, 2025 am 12:15 AM

新しいプラットフォームでJVMを作成することに直面する主な課題には、ハードウェアの互換性、オペレーティングシステムの互換性、パフォーマンスの最適化が含まれます。 1。ハードウェア互換性:JVMがRISC-Vなどの新しいプラットフォームのプロセッサ命令セットを正しく使用できるようにする必要があります。 2。オペレーティングシステムの互換性:JVMは、Linuxなどの新しいプラットフォームのシステムAPIを正しく呼び出す必要があります。 3。パフォーマンスの最適化:パフォーマンステストとチューニングが必要であり、ガベージコレクション戦略が新しいプラットフォームのメモリ特性に適応するように調整されます。

Javafxライブラリは、GUI開発におけるプラットフォームの矛盾にどのように対処しようとしていますか?Javafxライブラリは、GUI開発におけるプラットフォームの矛盾にどのように対処しようとしていますか?Apr 30, 2025 am 12:01 AM

javafxefcectivelyaddressessessistencisingisingidevidementsyusaplatform-agnosticscenegraphandcssstyling.1)itabstractsplatformspificsthroughascenegraph、Assuring-sunsinstentrenderingacrosswindows、macos、andlinux.2)

JVMがJavaコードと基礎となるオペレーティングシステムの間の仲介者としてどのように機能するかを説明します。JVMがJavaコードと基礎となるオペレーティングシステムの間の仲介者としてどのように機能するかを説明します。Apr 29, 2025 am 12:23 AM

JVMは、Javaコードをマシンコードに変換し、リソースを管理することで機能します。 1)クラスの読み込み:.classファイルをメモリにロードします。 2)ランタイムデータ領域:メモリ領域を管理します。 3)実行エンジン:実行バイトコードを解釈またはコンパイルします。 4)ローカルメソッドインターフェイス:JNIを介してオペレーティングシステムと対話します。

Javaのプラットフォーム独立におけるJava Virtual Machine(JVM)の役割を説明します。Javaのプラットフォーム独立におけるJava Virtual Machine(JVM)の役割を説明します。Apr 29, 2025 am 12:21 AM

JVMにより、Javaはプラットフォームを介して実行できます。 1)jvmは、bytecodeをロード、検証、実行します。 2)JVMの作業には、クラスの読み込み、バイトコード検証、解釈の実行、およびメモリ管理が含まれます。 3)JVMは、動的クラスの読み込みや反射などの高度な機能をサポートしています。

さまざまなオペレーティングシステムでJavaアプリケーションが正しく実行されるようにするために、どのような措置を講じますか?さまざまなオペレーティングシステムでJavaアプリケーションが正しく実行されるようにするために、どのような措置を講じますか?Apr 29, 2025 am 12:11 AM

Javaアプリケーションは、次の手順を通じて異なるオペレーティングシステムで実行できます。1)ファイルまたはパスクラスを使用してファイルパスを処理します。 2)System.getEnv()を介して環境変数を設定および取得します。 3)MavenまたはGradleを使用して、依存関係を管理し、テストします。 Javaのクロスプラットフォーム機能は、JVMの抽象化レイヤーに依存していますが、特定のオペレーティングシステム固有の機能の手動処理が必要です。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール