ホームページ Java &#&チュートリアル Spring MVC 例外を均一に処理する 3 つの方法

Spring MVC 例外を均一に処理する 3 つの方法

Aug 29, 2019 pm 04:22 PM
spring mvc

Spring には、統合例外処理の 3 つのメソッドがあります。つまり、

@ExceptionHandler アノテーションを使用する、HandlerExceptionResolver インターフェイスを実装する、および @controlleradvice アノテーションを使用する

Spring MVC 例外を均一に処理する 3 つの方法

#@ExceptionHandler アノテーションを使用する

このアノテーションを使用する場合の欠点の 1 つは、例外処理のメソッドがエラーの原因となったメソッドと同じコントローラー内に存在する必要があることです。次のように使用します。

@Controller      
public class GlobalController {
/**    
     * 用于处理异常的    
     * @return    
     */      
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.println(e.getMessage());
e.printStackTrace();
return "exception";
}
@RequestMapping("test")
public void test() {
throw new MyException("出错了!");
}
}

ご覧のとおり、このメソッドの最大の欠点は、例外をグローバルに制御できないことです。各クラスは 1 回記述する必要があります。

HandlerExceptionResolver インターフェイスを実装する

このメソッドにより、グローバルな例外制御が可能になります。例:

@Component  
public class ExceptionTest implements HandlerExceptionResolver{
/**  
     * TODO 简单描述该方法的实现功能(可选).  
     * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)  
     */  
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {
System.out.println("This is exception handler method!");
return null;
}
}

@ControllerAdvice @ExceptionHandler アノテーションを使用します

@ExceptionHandler で説明したように、例外処理を必要とするメソッドは、例外処理を必要とするメソッドと同じコントローラー内に存在する必要があります。エラーが発生しました。コードで @ControllerAdvice を追加する場合、同じコントローラー内にある必要はありません。これも Spring 3.2 によってもたらされた新機能です。名前からわかるように、一般的にはコントローラーの強化を意味します。つまり、@controlleradvice @ExceptionHandler はグローバル例外キャッチを実装することもできます。

この WebExceptionHandle クラスをスキャンして Spring コンテナにロードできることを確認してください。

@ControllerAdvice
@ResponseBody
public class WebExceptionHandle {
private static Logger logger = LoggerFactory.getLogger(WebExceptionHandle.class);
/**
     * 400 - Bad Request
     */
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ServiceResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
logger.error("参数解析失败", e);
return ServiceResponseHandle.failed("could_not_read_json");
}
/**
     * 405 - Method Not Allowed
     */
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ServiceResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
logger.error("不支持当前请求方法", e);
return ServiceResponseHandle.failed("request_method_not_supported");
}
/**
     * 415 - Unsupported Media Type
     */
@ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
public ServiceResponse handleHttpMediaTypeNotSupportedException(Exception e) {
logger.error("不支持当前媒体类型", e);
return ServiceResponseHandle.failed("content_type_not_supported");
}
/**
     * 500 - Internal Server Error
     */
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ServiceResponse handleException(Exception e) {
if (e instanceof BusinessException){
return ServiceResponseHandle.failed("BUSINESS_ERROR", e.getMessage());
}
logger.error("服务运行异常", e);
e.printStackTrace();
return ServiceResponseHandle.failed("server_error");
}
}

処理される例外の型が @ExceptionHandler アノテーションで宣言されていない場合、デフォルトでパラメータ リスト内の例外の型が使用されます。したがって、次のように書くこともできます。

@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler()
@ResponseBody
String handleException(Exception e){
return "Exception Deal! " + e.getMessage();
}
}

パラメータ オブジェクトは、コントローラー層によってスローされる例外オブジェクトです。

ResponseEntityExceptionHandler クラスを継承して、Rest インターフェイスのグローバル例外キャプチャを実装し、カスタム形式を返すことができます:

@Slf4j
@ControllerAdvice
public class ExceptionHandlerBean  extends ResponseEntityExceptionHandler {
/**
     * 数据找不到异常
     * @param ex
     * @param request
     * @return
     * @throws IOException
     */
@ExceptionHandler({DataNotFoundException.class})
public ResponseEntity<Object> handleDataNotFoundException(RuntimeException ex, WebRequest request) throws IOException {
return getResponseEntity(ex,request,ReturnStatusCode.DataNotFoundException);
}
/**
     * 根据各种异常构建 ResponseEntity 实体. 服务于以上各种异常
     * @param ex
     * @param request
     * @param specificException
     * @return
     */
private ResponseEntity<Object> getResponseEntity(RuntimeException ex, WebRequest request, ReturnStatusCode specificException) {
ReturnTemplate returnTemplate = new ReturnTemplate();
returnTemplate.setStatusCode(specificException);
returnTemplate.setErrorMsg(ex.getMessage());
return handleExceptionInternal(ex, returnTemplate,
new HttpHeaders(), HttpStatus.OK, request);
}
}

以上がSpring MVC 例外を均一に処理する 3 つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Spring Security 権限制御フレームワークの使用ガイド Spring Security 権限制御フレームワークの使用ガイド Feb 18, 2024 pm 05:00 PM

バックエンド管理システムでは、通常、さまざまなユーザーのインターフェイスへのアクセスを制限するために、アクセス許可制御が必要です。ユーザーに特定の権限がない場合、特定のインターフェイスにアクセスできません。この記事では、waynboot-mall プロジェクトを例として、一般的なバックエンド管理システムがアクセス許可制御フレームワーク SpringSecurity を導入する方法を紹介します。 waynboot-mall プロジェクトアドレス: https://github.com/wayn111/waynboot-mall 1. SpringSecurity とは SpringSecurity は、Spring フレームワークをベースとした、強力かつ柔軟なセキュリティの提供を目的としたオープンソース プロジェクトです。 Java アプリケーションの場合。

JAX-RS 対 Spring MVC: RESTful 巨人間の戦い JAX-RS 対 Spring MVC: RESTful 巨人間の戦い Feb 29, 2024 pm 05:16 PM

はじめに RESTful API は、最新の WEB アプリケーションに不可欠な部分になっています。これらは、Web サービスを作成および使用するための標準化されたアプローチを提供するため、移植性、拡張性、および使いやすさが向上します。 Java エコシステムでは、JAX-RS と springmvc が、RESTful API を構築するための 2 つの最も人気のあるフレームワークです。この記事では、両方のフレームワークについて詳しく説明し、その機能、利点、欠点を比較して、情報に基づいた決定を下せるようにします。 JAX-RS: JAX-RSAPI JAX-RS (JavaAPI for RESTful Web Services) は、REST 開発のために JavaEE によって開発された標準 JAX-RSAPI です。

Spring MVC の主要な概念をマスターする: これらの重要な機能を理解する Spring MVC の主要な概念をマスターする: これらの重要な機能を理解する Dec 29, 2023 am 09:14 AM

SpringMVC の主要な機能を理解する: これらの重要な概念を習得するには、特定のコード例が必要です。 SpringMVC は、開発者が Model-View-Controller (MVC) アーキテクチャ パターンを通じて柔軟でスケーラブルな構造を構築するのに役立つ Java ベースの Web アプリケーション開発フレームワークです。ウェブアプリケーション。 SpringMVC の主要な機能を理解して習得すると、Web アプリケーションをより効率的に開発および管理できるようになります。この記事では、SpringMVC の重要な概念をいくつか紹介します。

Java バックエンド開発: Java Spring MVC を使用した API MVC フレームワーク開発 Java バックエンド開発: Java Spring MVC を使用した API MVC フレームワーク開発 Jun 17, 2023 am 10:27 AM

Java バックエンド開発は、現代のインターネット アプリケーションの中核となる非常に重要なテクノロジです。 Java バックエンド開発には主に APIMVC フレームワーク開発が含まれます。この記事では、APIMVCフレームワーク開発にJavaSpringMVCを使用する方法を紹介します。 JavaSpringMVC は非常に強力なオープンソース フレームワークであり、主に Web アプリケーションの開発に使用されます。 MVC (Model-View-Controller) アーキテクチャ モデルを使用します。

Javaにおけるコントローラーパッケージの役割 Javaにおけるコントローラーパッケージの役割 May 07, 2024 am 02:45 AM

Spring MVC アーキテクチャでは、コントローラー パッケージはユーザー リクエストを処理し、応答を返すことによってビジネス ロジックを実装します。その役割には、ユーザー リクエストの受信 (通常は HTTP 経由) が含まれます。リクエストパラメータを検証して処理します。適切なビジネス ロジック (通常はサービス層) を呼び出します。ビューをレンダリングしてユーザーに返します (通常は HTML、JSON、または XML)。

Go 言語と Java: 機能からアプリケーションまでの比較 Go 言語と Java: 機能からアプリケーションまでの比較 Apr 08, 2024 pm 02:45 PM

Go と Java の主な違いは、型システム、同時実行性、メモリ管理です。 Go は静的型システムを使用し、コンパイル時に型の宣言を強制します。一方、Java は、実行時に型を推論できる半静的型システムを使用します。 Go の Goroutine は高い同時実行性をサポートしますが、Java は Java スレッドとロック メカニズムを使用します。 Go はガベージ コレクターを使用してメモリを自動的に管理しますが、Java では特定のリソースを明示的に管理する必要があります。これらの違いは、さまざまなアプリケーション シナリオにつながります。Go は同時実行性の高い Web サービス、クラウド コンピューティング、ビッグ データに適しており、Java は複雑さと安定性を必要とするエンタープライズ レベルのアプリケーションに適しています。

Spring WebFlux フレームワークのアーキテクチャと従来の Spring MVC の違いは何ですか? Spring WebFlux フレームワークのアーキテクチャと従来の Spring MVC の違いは何ですか? Apr 17, 2024 pm 02:36 PM

SpringWebFlux と SpringMVC の主な違いは、リアクティブ プログラミング (非同期処理) とブロッキング I/O モデルです。この違いは、非同期処理とイベント ループ モデル、関数インターフェイスに基づくハンドラー、簡素化された例外処理メカニズム、およびスループットの向上につながります。

Java アーキテクチャの開発の歴史: J2EE から SpringBoot まで Java アーキテクチャの開発の歴史: J2EE から SpringBoot まで Feb 02, 2024 pm 04:02 PM

Java アーキテクチャは、エンタープライズ アプリケーション開発で広く使用されているプログラミング言語です。テクノロジーの継続的な進歩と開発ニーズの変化に伴い、Java アーキテクチャも複数の進化と開発を経てきました。この記事では、J2EE から SpringBoot までの Java アーキテクチャの進化と発展について説明します。 J2EE 時代 J2EE (Java2Platform、Enterprise Edition) は、1999 年に開始された Java アーキテクチャにおける重要なマイルストーンです。一連の標準を提供します

See all articles