チュートリアルの春BOOT2シリーズの三種類(XII)@ControllerAdviceの使用シナリオ

春ブーツでControllerAdviceも使用シナリオの広い範囲を持っています@厳密に言えば、これは、同じ系統の春ブーツやSpringMVC、@ControllerAdviceのために、彼らは精通していない、春のブート知識で考えられているが、多くはSpringMVCの小さなパートナーを学習されません、そこで、この記事では、我々はこの問題とのチャットます。

名前が示すように@ControllerAdviceは、多くの初心者がこのコメントを聞いたことがないかもしれないが、実際には、これは非常に有益なコメントで、これはコントローラの拡張機能です。コントローラーを使用して、三つの機能を達成することができます。

  1. グローバル例外ハンドラ
  2. グローバルデータバインディング
  3. グローバルデータの前処理

多くの作業を簡素化するために私たちを助けることができるこれらの三つの機能の柔軟な使用が、これはSpringMVCは春ブーツに直接使用することができる機能を提供していることに注意する必要があり、次のように実行しました。

グローバル例外ハンドラ

@ControllerAdviceは、グローバルな例外ハンドラを使用して実装次のように、注釈を追加するために、クラスの唯一の定義は、定義されます。

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView customException(Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("message", e.getMessage());
        mv.setViewName("myerror");
        return mv;
    }
}

このクラスでは、この方法は、ヌルポインタの異なる異常そのような特殊処理方法、特殊処理方法のアレイの境界に対処するための異なる複数の方法を定義することができる...、治療の方法は、上記コードに直接であってもよいようにすべての例外メッセージ。

指定された場合NullPointerExceptionがある場合、すなわち、異常を示すために使用される治療の@ExceptionHandler注釈タイプは、アレイに結合した例外は、この方法に入りません。

グローバルデータバインディング

バインディング機能のグローバルデータは、いくつかの初期化データの操作を行うために使用することができ、各コントローラのインタフェースで、あなたはこれらのデータにアクセスできるように、私たちは、クラスにいくつかの一般的なデータ追加@ControllerAdviceノートを定義することができますつながります。

次のように使用する手順は、まず、グローバルデータを定義しました。

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ModelAttribute(name = "md")
    public Map<String,Object> mydata() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("age", 99);
        map.put("gender", "男");
        return map;
    }
}

使用@ModelAttributeアノテーションは値を返し、もちろん、開発者は、name属性で行くことができる再注釈@ModelAttributeを指定するグローバルデータは、デフォルトでは、このキーグローバルデータは変数名で返される戻りデータの方法は、値が方法であるマークキー。

定義されると、コントローラインターフェイスのいずれかに、ここで定義されたデータを得ることができます。

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        Map<String, Object> map = model.asMap();
        System.out.println(map);
        int i = 1 / 0;
        return "hello controller advice";
    }
}

グローバルデータの前処理

次のように私は2つのエンティティクラス、書籍や著者を持って考えると、定義されています。

public class Book {
    private String name;
    private Long price;
    //getter/setter
}
public class Author {
    private String name;
    private Integer age;
    //getter/setter
}

この時点で、私は次のように、追加するデータ・インタフェースを定義した場合:

@PostMapping("/book")
public void addBook(Book book, Author author) {
    System.out.println(book);
    System.out.println(author);
}

今回は、2つのエンティティクラスは転送を区別することはできません前から、name属性を持っているので、問題があるでしょうアクションを追加します。この時、私たちは、グローバルデータ前処理することにより、この問題を解決することができ@ControllerAdvice

次のように解決します。

1.別名変数は、インターフェイスに

@PostMapping("/book")
public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) {
    System.out.println(book);
    System.out.println(author);
}

2.要求データの前処理は、
次のコード@ControllerAdviceクラスタグを追加します。

@InitBinder("b")
public void b(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("b.");
}
@InitBinder("a")
public void a(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("a.");
}

@InitBinder(「B」)は、すなわち、パラメータBのプレフィックスを要求する必要があり、パラメータbに、プロセスに注釈予約と関連するパラメータを処理するために使用される方法は、接頭辞を追加していることを示します。

3.リクエストを送信

リクエストが送信されると、オブジェクトの異なるパラメータに異なるプレフィックスを追加することによって、微分パラメータを達成することができます。

概要

これはまた、マイクロ春ブーツ+春のクラウドサービスで使用することができ、ソングGeは@ControllerAdviceこれらの点は、両方の従来のSSMのプロジェクトで使用することができます導入、使用するすべての人のためのいくつかの簡単なで、問題を議論するために歓迎します。

ジャワ、JavaのドライソングGeはあなたのために慎重に準備された受信した後、国民の関心番号[南]少し雨が、懸念は返信共有するために、定期的に春ブーツ+マイクロサービスとフロントと分離フルスタック技術、ビデオチュートリアルの後端に焦点を当てました!

おすすめ

転載: www.cnblogs.com/lenve/p/11696717.html