【SpringMVC】JSONデータのリターンと例外処理(これを読めば理解できると思います)

目次

1. JSONデータの返却

1. 依存関係をインポートする

2. 設定ファイル

3、ジャクソン

3.1. はじめに

3.2. 特徴

3.3. よく使用されるアノテーション

4. @ResponseBodyアノテーションの使用

4.1. コントローラー層

4.2、ビズレイヤー

4.3、sql.xml

4.4. ページ

4.5. テスト

4.6. @ResponseBody に注意する

2. 例外処理

1. なぜグローバル例外処理を使用するのでしょうか?

2. 例外処理のアイデア

3. SpringMVC例外分類

4. 異常な場合

4.1. 例外処理方法 1

4.2. 例外処理方法2

4.3. 例外処理方法3


1. JSONデータの返却

1. 依存関係をインポートする

SpringMVCpom.xmlファイルにjackson依存関係を追加します

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.3</version>
</dependency> 

2. 設定ファイル

独自に構成された Spring-mvc.xml ファイルに構成を追加します

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>
    <bean id="mappingJackson2HttpMessageConverter"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>text/json;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>

3、ジャクソン

3.1. はじめに

Jackson は、Java オブジェクトと JSON データ間の変換を行うためのオープン ソース ライブラリです。これは、Java オブジェクトを JSON 形式の文字列にシリアル化し、JSON 文字列を Java オブジェクトに逆シリアル化できる強力な API セットを提供します。

Jackson ライブラリは 3 つのコア モジュールで構成されています。

  1. Jackson Databind : Java オブジェクトを JSON データ (シリアル化および逆シリアル化) にバインドするために使用されます。これは、 @JsonProperty@JsonFormatなどの一連の注釈を提供します。これらは、オブジェクト プロパティと JSON フィールドの間のマッピング関係や、日付や時刻などの特殊な型の処理メソッドを指定するために使用されますDatabind モジュールは、ポリモーフィック型処理、双方向参照処理などの高度な機能も提供します。

  2. Jackson Core : JsonParser (JSON 文字列の解析に使用)、 JsonGenerator (JSON 文字列の生成に使用)など、JSON 処理のコア関数を提供します。Core モジュールは、いくつかの基本的なデータ型とコレクション型のシリアル化と逆シリアル化のサポートも提供します。

  3. Jackson 注釈: Java クラスの JSON フィールドの名前、順序、デフォルト値、その他のプロパティを指定するためのいくつかの注釈を提供します。これらのアノテーションはデータバインド モジュールで使用されます。

Jackson は、シンプルな Java ベースのアプリケーション ライブラリです。Jacksonは、 Java オブジェクトを json オブジェクトと xml ドキュメントに簡単に変換できます。また、json と xmlをJava オブジェクトに変換することもできます。Jackson は、依存する jar パッケージが少なく、使いやすく、パフォーマンスが比較的高く、Jackson コミュニティは比較的活発で、更新速度も比較的速いです。

3.2. 特徴

  • 使いやすく、一般的な使用例を簡素化する高レベルのルック アンド フィールを提供します。
  • マッピングを作成する必要はありません。API は、ほとんどのオブジェクトのシリアル化に対してデフォルトのマッピングを提供します。
  • 高性能、高速、低メモリ使用量
  • クリーンな JSON を作成する
  • 他のライブラリに依存しない
  • コードオープンソース

3.3. よく使用されるアノテーション

Jacksonライブラリは、Java クラスの JSON フィールドに関連するプロパティと動作を指定するために一般的に使用されるアノテーションをいくつか提供します。

共通の注釈
注釈 説明する
@JsonIgnore
 
フィールドまたはメソッドに作用して、注釈が付けられたフィールドおよびメソッドに対応する属性を完全に無視します。
 
@JsonProperty
 
フィールドまたはメソッドに作用し、属性のシリアル化/逆シリアル化に使用されます。属性の欠落を回避し、属性名の変更を行うために使用できます。
 
@JsonIgnoreProperties
 
クラスに作用して、シリアル化/逆シリアル化中に一部の属性を無視する必要があることを示します。
 
@JsonUnwrapped
 
子 JSON オブジェクトのプロパティを周囲の JSON オブジェクトに追加するために使用される、プロパティ フィールドまたはメソッドに作用します。
 
@JsonFormat
 
日付や時刻などの特殊な種類の書式設定方法を指定するために使用されます。日付形式は、このアノテーションの pattern 属性を通じて指定できます。例えば:
@JsonFormat(pattern="yyyy-MM-dd") private Date birthDate;

  1. @JsonInclude : シリアル化中に特定の属性を含めるかどうかを制御するために使用されます。属性を含める条件はアノテーションの value 属性で指定できます。例えば:

    @JsonInclude(JsonInclude.Include.NON_NULL) private String address;

  2. @JsonAlias : 複数の JSON フィールドと同じ Java プロパティ間のマッピング関係を指定するために使用されます。複数の JSON フィールドの名前は、このアノテーションの value 属性を通じて指定できます。例えば:

    @JsonAlias({"firstName", "first_name"}) private String name;

  3. @JsonGetter および @JsonSetter : カスタムの getter メソッドおよび setter メソッドと JSON フィールドの間のマッピング関係を指定するために使用されます。例えば:

    @JsonGetter("name") public String getUserName() { return userName; }

  4. @JsonAnyGetter および @JsonAnySetter : 未定義のプロパティ (つまり、Java クラスで定義されていないプロパティ) を処理するために使用されます。これらの属性は、これらの注釈を通じてマップまたは他の形式に動的に変換できます。例えば:

    @JsonAnyGetter public Map<String, Object> getAdditionalProperties() { return additionalProperties; }

4. @ResponseBodyアノテーションの使用

@ResponseBodyアノテーションは、Spring フレームワークで一般的に使用されるアノテーションの 1 つで、通常、コントローラー メソッドまたは Restful API メソッドで使用され、メソッドによって返された結果を、メソッドによって解析されるのではなく、HTTP 応答本文に直接書き込まれるように指示します。パーサーを表示します。メソッドによって返されたオブジェクトを、JSON、XML、その他の形式などの指定された形式に変換し、HTTP 応答本文としてクライアントに返すことができます。

機能: Controllerのメソッドから返されたオブジェクトを、適切なコンバーターを介して指定された形式に変換した後、応答オブジェクトのボディ領域に書き込まれ、通常はJSONデータまたはXMLデータを返すために使用されます

 注: このアノテーションを使用した後、ビュー パーサーは使用されませんが、データは入力ストリームに直接書き込まれます。その効果は、応答オブジェクトを通じて指定された形式でデータを出力するのと同じです。

@ResponseBodyアノテーションが付けられたメソッドは、通常のオブジェクト、コレクション、文字列など、あらゆるタイプのオブジェクトを応答本文として返すことができます。Spring は、リクエスト ヘッダーの「 Accept 」フィールドに基づいて、変換に適切な HttpMessageConverter を自動的に選択します。たとえば、リクエストヘッダーに「 Accept:  http://localhost:8080/json 」が指定されている場合、返されるオブジェクトは JSON 形式の文字列に変換されます。

4.1. コントローラー層

package com.tgq.web;

import com.tgq.biz.MyStudentBiz;
import com.tgq.model.MyStudent;
import com.tgq.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @软件包名 com.tgq.web
 * @用户 tgq
 * @create 2023-09-13 下午2:27
 * @注释说明:
 */
@Controller
//@ResponseBody
//@RestController
@RequestMapping("/sc/json")
public class JsonController {
    @Autowired
    private MyStudentBiz myStudentBiz;

    @RequestMapping("/jsp")
    public String updateByPrimaryKeySelective() {
        return "json/list";
    }

    /**
     * 返回List<T>
     *
     * @param req
     * @param MyStudent
     * @return
     */
    @ResponseBody
    @RequestMapping("/list")
    public List<MyStudent> list(HttpServletRequest req, MyStudent MyStudent) {
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<MyStudent> list = this.myStudentBiz.selectPager(MyStudent, pageBean);
        return list;
    }

    /**
     * 返回T
     *
     * @param req
     * @param MyStudent
     * @return
     */
    @ResponseBody
    @RequestMapping("/load")
    public MyStudent load(HttpServletRequest req, MyStudent MyStudent) {
        if (MyStudent.getSname() != null) {
            List<MyStudent> list = this.myStudentBiz.selectPager(MyStudent, null);
            return list.get(0);
        }
        return null;
    }


    /**
     * 返回List<Map>
     *
     * @param req
     * @param MyStudent
     * @return
     */
    @ResponseBody
    @RequestMapping("/mapList")
    public List<Map> mapList(HttpServletRequest req, MyStudent MyStudent) {
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Map> list = this.myStudentBiz.mapSelectPager(MyStudent, pageBean);
        return list;
    }

    /**
     * 返回Map
     *
     * @param req
     * @param MyStudent
     * @return
     */
    @ResponseBody
    @RequestMapping("/mapLoad")
    public Map mapLoad(HttpServletRequest req, MyStudent MyStudent) {
        if (MyStudent.getSname() != null) {
            List<Map> list = this.myStudentBiz.mapSelectPager(MyStudent, null);
            return list.get(0);
        }
        return null;
    }


    @ResponseBody
    @RequestMapping("/all")
    public Map all(HttpServletRequest req, MyStudent MyStudent) {
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<MyStudent> list = this.myStudentBiz.selectPager(MyStudent, pageBean);
        Map map = new HashMap();
        map.put("list", list);
        map.put("pageBean", pageBean);
        return map;
    }

    @ResponseBody//注释 跳的就是页面,就不是显示的字符串
    @RequestMapping("/jsonStr")
    public String jsonStr(HttpServletRequest req, MyStudent MyStudent) {
        return "sc-edit";
    }


}

4.2、ビズレイヤー

    @Override
    public List<Map> mapSelectPager(MyStudent myStudent, PageBean pageBean) {
        return myStudentMapper.mapSelectPager(myStudent);
    }

4.3、sql.xml

    <select id="mapSelectPager" resultType="java.util.Map" parameterType="com.tgq.model.MyStudent">
        select *
        from t_mysql_student
        <where>
            <if test="sname != null"/>
            and sname like concat('%',#{sname},'%')
        </where>
    </select>

4.4. ページ

<%--
  Created by IntelliJ IDEA.
  User: tgq
  Date: 13/9/2023
  Time: 下午2:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>JSON</h3>
<a href="${pageContext.request.contextPath}/sc/json/list?sname=">返回List&lt;T&gt;</a>
<hr>
<a href="${pageContext.request.contextPath}/sc/json/mapList?sname=">返回List&lt;Map&gt;</a>
<hr>
<a href="${pageContext.request.contextPath}/sc/json/load?sname=三">返回T</a>
<hr>
<a href="${pageContext.request.contextPath}/sc/json/mapLoad?sname=三">返回Map</a>
<hr>
<a href="${pageContext.request.contextPath}/sc/json/all?sname=">返回混合</a>
<hr>
<a href="${pageContext.request.contextPath}/sc/json/jsonStr">返回JSON字符串</a>
<hr>
</body>
</html>

4.5. テスト

http://localhost:8080/sc/json/jsp

4.6. @ResponseBody に注意する

@ResponseBodyアノテーションをクラス名に追加すると、内部のすべてのメソッドは文字列を返します

@RestController : @Controller@ResponseBodyを置き換えることができます

2. 例外処理

1. なぜグローバル例外処理を使用するのでしょうか?

グローバル例外処理は、アプリケーション内の例外を一元的に処理する方法です。その主な目的は、例外がスローされる可能性のあるすべての場所で個別に処理するのではなく、アプリケーションでスローされた例外を処理するための統一されたメカニズムを提供することです。

グローバル例外処理を使用する利点は次のとおりです。

  1. コードの単純さ: グローバル例外処理を通じて、例外処理ロジックをビジネス コードから分離し、ビジネス コードをより簡潔かつ明確にすることができます。ビジネス コードは、コア ビジネス ロジックに重点を置き、例外処理を専用の例外ハンドラーに任せるだけで済みます。

  2. 統合例外処理: グローバル例外処理は、アプリケーションで例外を処理するための統合メカニズムを提供します。コントローラーでリクエストを処理するときにスローされる例外であっても、サービス層、永続層、その他の場所でスローされる例外であっても、グローバル例外ハンドラーで処理できます。これにより、アプリケーション内のすべての例外を均一に処理できるようになり、開発効率とコードの品質が向上します。

  3. 例外情報の親しみやすさ: グローバル例外処理を通じて、例外情報の形式と内容をカスタマイズして、より親しみやすく理解しやすくすることができます。特定のビジネス ニーズに基づいて、異常情報をユーザーの表示に適した形式に変換したり、トラブルシューティングのためにログに記録したりできます。

  4. 例外リターンの統一: グローバル例外処理において、例外リターンの形式と内容を統一して定義できます。たとえば、一般的なエラー応答オブジェクトを定義して、例外情報をカプセル化し、それをクライアントに一律に返すことができます。これにより、各コントローラー メソッドで例外を手動で処理したり、エラー メッセージを返したりする必要がなくなります。

  5. セキュリティ: グローバル例外処理を通じて、未処理の例外をキャプチャして処理し、例外情報がクライアントに公開されるのを防ぎ、それによってアプリケーションのセキュリティを向上させることができます。

グローバル例外処理は、アプリケーションの例外を一元的に処理する方法を提供し、コード ロジックを簡素化し、コードの可読性と保守性を向上させます。これにより、例外をより適切に処理し、ユーザー エクスペリエンスを最適化し、アプリケーションの安定性とセキュリティを向上させることができます。

2. 例外処理のアイデア

最初の考え方:

システムの dao、サービス、およびコントローラーの例外はすべて throws Exception を通じて上方にスローされ、最後に springmvc フロントエンド コントローラーが例外処理のために例外ハンドラーにそれを渡します。Springmvc は、統一された例外処理のためのグローバル例外ハンドラー (システムには例外ハンドラーが 1 つだけあります) を提供します。

2 番目のアイデアに従うこともできます。

  1. 例外をキャッチする: コード内で try-catch ステートメント ブロックを使用して、スローされる可能性のある例外をキャッチします。例外をスローする可能性のあるコードを try ブロックに配置し、キャッチされた例外を catch ブロックで処理します。複数の catch ブロックを使用して、さまざまな例外タイプに応じてさまざまなタイプの例外を処理できます。

  2. ログ: 例外処理プロセス中に、その後のトラブルシューティングとデバッグを容易にするために、例外情報を記録する必要があります。ログ フレームワーク (Log4j、Slf4j など) を使用して、例外タイプ、例外メッセージ、スタック トレースなどの例外情報を記録できます。ログを記録することで、潜在的な問題を発見し、時間内に解決できます。

  3. フレンドリーなプロンプト: 特定のビジネス ニーズに基づいて、例外情報をユーザーが理解して処理できるフレンドリーなプロンプト情報に変換できます。例外クラスをカスタマイズして例外のエラー コードとエラー メッセージを設定し、エラー コードに基づいて対応するプロンプト情報をユーザーに返すことができます。

  4. 例外リターン: Web アプリケーションでは、グローバル例外ハンドラーを使用して、例外情報を統合エラー応答にカプセル化し、それをクライアントに返すことができます。これにより、統一された例外処理ロジックが提供され、各コントローラー メソッドでの手動の例外処理が回避されます。

  5. 例外チェーン配信: 例外をキャッチした後、新しい例外をスローするか、元の例外をパラメータとして上位レベルの呼び出し元に渡して、上位レベルの呼び出し元が例外を処理できるようにすることができます。例外チェーンを通じて、例外情報を適切な場所に転送して処理できます。

  6. 例外処理戦略: 回復可能な例外の場合、対応する処理戦略を採用して、通常のプログラム実行の復元を試みることができます。たとえば、データベースに再接続したり、リクエストを再送信したりできます。回復不可能な例外の場合は、関係者に通知するか、緊急治療を実行できます。

  7. 異常の監視と統計: 監視ツールやログ分析ツールを使用して異常を監視およびカウントし、異常な問題をタイムリーに発見して解決できます。異常な情報を収集して分析することで、システムのパフォーマンスを最適化し、ユーザー エクスペリエンスを向上させることができます。

例外を処理するという考え方は、例外をキャプチャし、例外を記録し、わかりやすいプロンプトを表示し、例外を返し、特定の状況に応じて適切な処理戦略を採用し、例外の監視と統計を実行することです。適切な例外処理により、アプリケーションの安定性と保守性が向上し、ユーザー エクスペリエンスが最適化され、潜在的な問題をタイムリーに発見して解決できます。

3. SpringMVC例外分類

  • Spring MVC が提供する単純な例外ハンドラー SimpleMappingExceptionResolver を使用します。 
  • Spring の例外処理インターフェイス HandlerExceptionResolver を実装して、独自の例外ハンドラーをカスタマイズします。
  • @ControllerAdvice + @ExceptionHandler を使用する

  1. コントローラー例外: コントローラー例外は、クライアント要求の処理中に発生する例外です。これらの例外は通常、コントローラー メソッドによってスローされ、検証エラー、リクエスト パラメーター エラーなどが含まれる場合があります。@ExceptionHandlerアノテーションを使用すると、コントローラー例外を処理し、例外処理ロジックを 1 か所に集中させ、エラー情報をクライアントに均一に返すことができます。

  2. サービス層の例外: サービス層の例外は、通常、データ クエリの失敗、ビジネス ルールの検証の失敗などのビジネス ロジックによって発生します。サービス レイヤー例外はサービス レイヤーでキャッチして処理する必要があるため、try-catch ステートメント ブロックまたはカスタム例外ハンドラーを使用してサービス レイヤー例外を処理できます。

  3. データ アクセス例外: データ アクセス例外は主に、データベース接続の失敗、SQL ステートメントの実行エラーなどのデータベース操作によって発生します。Spring MVC では、Spring のデータ アクセス フレームワーク (Spring Data JPA、MyBatis など) を使用してデータ アクセス例外を処理でき、このフレームワークは基になる例外を Spring のデータ アクセス例外 (DataAccessException など) に自動的に変換します。

  4. グローバル例外: グローバル例外とは、アプリケーションで捕捉および処理されない例外、または予測不可能な例外を指します。グローバル例外ハンドラー (@ControllerAdviceアノテーション ) を使用してグローバル例外を処理し、例外処理ロジックを 1 か所に集中させてエラー情報を均一に処理して返すことができます。

  5. 実行時例外: 実行時例外 ( RuntimeException ) は、明示的にキャッチして処理する必要のない例外です。これらの例外は通常、NULL ポインター例外、配列範囲外例外などのプログラム エラーまたはロジック エラーによって発生します。Spring MVC では、ランタイム例外はサーブレット コンテナによってキャッチされ、デフォルトのエラー ページ (500 内部サーバー エラー ページなど) が返されます。

さまざまなタイプの例外に対して、特定のニーズに応じてさまざまな処理方法を選択できます。例外の中には、通常のプログラムの実行を再開するために捕捉して処理できるものもありますが、関連する担当者への通知や緊急処理が必要な場合もあります。例外を適切に分類して処理することにより、アプリケーションの安定性と保守性を向上させることができます。

4. 異常な場合

4.1. 例外処理方法 1

SpringMVC には、 HandlerExceptionResolverインターフェイスを実装するSimpleMappingExceptionResolverという例外ハンドラーが付属しており、すべてのグローバル例外ハンドラーはこのインターフェイスを実装する必要があります。

spring-mvc.xml

<!-- springmvc提供的简单异常处理器 -->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!-- 定义默认的异常处理页面 -->
        <property name="defaultErrorView" value="error"/>
        <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->
        <property name="exceptionAttribute" value="ex"/>
        <!-- 定义需要特殊处理的异常,这是重要点 -->
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.RuntimeException">error</prop>
            </props>
            <!-- 还可以定义其他的自定义异常 -->
        </property>
    </bean>

ページジャンプは SpringMVC によって引き継がれるため、ここで定義されたデフォルトの例外処理ページは論理ビュー名として構成する必要があります。

    @RequestMapping("/error")
    public String error(MyStudent MyStudent) {
        MyStudent = null;
        MyStudent.getSname();
        return "error";
    }

珍しいインターフェースを書く

<%--
  Created by IntelliJ IDEA.
  User: tgq
  Date: 13/9/2023
  Time: 下午6:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>
错误信息....
${ex}
</body>
</html>

効果をテストする

http://localhost:8080/sc/json/error

4.2. 例外処理方法2

2 つのパッケージを作成し、その中に 2 つのクラスを書き込みます

グローバル例外 

package com.tgq.exception;

public class GlobalException extends RuntimeException {
    public GlobalException() {
    }

    public GlobalException(String message) {
        super(message);
    }

    public GlobalException(String message, Throwable cause) {
        super(message, cause);
    }

    public GlobalException(Throwable cause) {
        super(cause);
    }

    public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}


 

GlobalExceptionハンドラ 

package com.tgq.component;

import com.tgq.exception.GlobalException;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                         HttpServletResponse httpServletResponse,
                                         Object o, Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("error");
        if (e instanceof GlobalException) {
            GlobalException globalException = (GlobalException) e;
            mv.addObject("ex", globalException.getMessage());
            mv.addObject("msg", "全局异常....");
        } else if (e instanceof RuntimeException) {
            RuntimeException runtimeException = (RuntimeException) e;
            mv.addObject("ex", runtimeException.getMessage());
            mv.addObject("msg", "运行时异常....");
        } else if (e instanceof RuntimeException) {
            RuntimeException runtimeException = (RuntimeException) e;
            mv.addObject("ex", e.getMessage());
            mv.addObject("msg", "其他异常....");
        }
        return mv;
    }
}

例外は後でカスタマイズすることもできます

メソッドテストを書く

    @RequestMapping("/error02")
    public String error2(HttpServletRequest req) {
      if (true)
          throw new GlobalException("老异常了");
        return "error";
    }

ページコード

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>
错误信息....
${msg}
</body>
</html>

http://localhost:8080/sc/json/error02

4.3. 例外処理方法3

コンポーネントパッケージのGlobalExceptionHandler をGlobalExceptionResolver 
GlobalExceptionResolver 
に置き換えることができます。これは、内部で返されるjson形式とジャンプ ページです。

package com.tgq.component;

import com.tgq.exception.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalExceptionResolver {

//    跳转错误页面
//    @ExceptionHandler
//    public ModelAndView handler(Exception e){
//        ModelAndView mv = new ModelAndView();
//        mv.setViewName("error");
//        if (e instanceof GlobalException){
//            GlobalException globalException = (GlobalException) e;
//            mv.addObject("ex",globalException.getMessage());
//            mv.addObject("msg","全局异常....");
//        }else if (e instanceof RuntimeException){
//            RuntimeException runtimeException = (RuntimeException) e;
//            mv.addObject("ex",runtimeException.getMessage());
//            mv.addObject("msg","运行时异常....");
//        }
//        return mv;
//    }

    // 返回错误json数据
    @ResponseBody
    @ExceptionHandler
    public Map handler(Exception e) {
        Map map = new HashMap();
        if (e instanceof GlobalException) {
            GlobalException globalException = (GlobalException) e;
            map.put("ex", globalException.getMessage());
            map.put("msg", "全局异常....");
        } else if (e instanceof RuntimeException) {
            RuntimeException runtimeException = (RuntimeException) e;
            map.put("ex", runtimeException.getMessage());
            map.put("msg", "运行时异常....");
        } else {
            map.put("ex", e.getMessage());
            map.put("msg", "其它异常....");
        }
        return map;
    }
}

試験結果

json形式

ページ

おすすめ

転載: blog.csdn.net/weixin_74383330/article/details/132852735