@RestControllerAdviceの役割と原則春ブーツシリーズ(8)@ControllerAdviceインターセプト異常と統一された治療

オリジナル:春ブーツシリーズ(8)@ControllerAdviceインターセプト異常と統一された治療

春3.2では、@ControllerAdviceのアノテーションは、@ exceptionHandlerの、@ InitBinder、@ ModelAttributeを定義するために使用することができます追加 、 および内のすべての@RequestMappingに適用されます。参考:@ControllerAdviceドキュメント

I.はじめに

MyControllerAdviceの作成、および@ControllerAdviceのコメントを追加。

package com.sam.demo.controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap; import java.util.Map; /** * controller 增强器 * @author sam * @since 2017/7/17 */ @ControllerAdvice public class MyControllerAdvice { /** * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器 * @param binder */ @InitBinder public void initBinder(WebDataBinder binder) {} /** * 把值绑定到Model中,使全局@RequestMapping可以获取到该值 * @param model */ @ModelAttribute public void addAttributes(Model model) { model.addAttribute("author", "Magical Sam"); } /** * 全局异常捕捉处理 * @param ex * @return */ @ResponseBody @ExceptionHandler(value = Exception.class) public Map errorHandler(Exception ex) { Map map = new HashMap(); map.put("code", 100); map.put("msg", ex.getMessage()); return map; } } 

アプリケーションを起動した後、ある@ exceptionHandlerの、@ InitBinder、@ ModelAttributeアノテーション付きメソッドは、注釈を@RequestMapping方法に適用されます。

@ModelAttribute:すべての方法は@RequestMappingに注釈されているため、次のようにモデルに設定された値は、、、ModelMapにより得ることができます。

@RequestMapping("/home")
public String home(ModelMap modelMap) {
    System.out.println(modelMap.get("author")); } //或者 通过@ModelAttribute获取 @RequestMapping("/home") public String home(@ModelAttribute("author") String author) { System.out.println(author); }

@ExceptionHandlerが例外を傍受、我々は独自の例外処理は、コメントすることにより達成されることができます。、@ exceptionHandlerの設定値指定した例外の種類は、上記Exception.classにこの異常を傍受傍受する必要があります。

第二に、ハンドリングカスタム例外(グローバル例外ハンドラ)

デフォルトでは、春のブーツは、/エラー例外処理にマッピングされたが、それは非常に友好的ではないことを、カスタムの例外処理、優しいショー以下。

1.カスタム例外クラスを書きます:

package com.sam.demo.custom;

/**
 * @author sam
 * @since 2017/7/17
 */
public class MyException extends RuntimeException { public MyException(String code, String msg) { this.code = code; this.msg = msg; } private String code; private String msg; // getter & setter } 
注:のRuntimeExceptionのトランザクションロールバックするバネます。

2、グローバルな例外ハンドラクラスの作成

次のように、MyControllerAdvice.javaの作成:

package com.sam.demo.controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map; /** * controller 增强器 * * @author sam * @since 2017/7/17 */ @ControllerAdvice public class MyControllerAdvice { /** * 全局异常捕捉处理 * @param ex * @return */ @ResponseBody @ExceptionHandler(value = Exception.class) public Map errorHandler(Exception ex) { Map map = new HashMap(); map.put("code", 100); map.put("msg", ex.getMessage()); return map; } /** * 拦截捕捉自定义异常 MyException.class * @param ex * @return */ @ResponseBody @ExceptionHandler(value = MyException.class) public Map myErrorHandler(MyException ex) { Map map = new HashMap(); map.put("code", ex.getCode()); map.put("msg", ex.getMsg()); return map; } } 

図3に示すように、コントローラ試験のためにスローされます。

@RequestMapping("/home")
public String home() throws Exception { // throw new Exception("Sam 错误"); throw new MyException("101", "Sam 错误"); }

アプリケーションを起動し、訪問します。http:// localhost:8080 /家、通常以下のJSONコンテンツを、証明カスタム例外が正常に傍受されています。

{"msg":"Sam 错误","code":"101"}

*あなたはJSONデータを返しませんし、ページテンプレートがブラウザに返されるレンダリングするために、あなたがMyControllerAdviceを達成することができた場合:

@ExceptionHandler(value = MyException.class)
public ModelAndView myErrorHandler(MyException ex) {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("error"); modelAndView.addObject("code", ex.getCode()); modelAndView.addObject("msg", ex.getMsg()); return modelAndView; }

templatesディレクトリには、error.ftl(ここではFreeMarkerの使用)のレンダリングを追加します。

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>错误页面</title> </head> <body> <h1>${code}</h1> <h1>${msg}</h1> </body> </html>

// localhostを:8080 /家庭表示カスタムエラーページのコンテンツアプリケーションは、httpを再起動します。

注:すべての例外ハンドラがJSONを返す場合の方法は@ResponseBodyを追加することができないように、それは、@RestControllerAdvice @ControllerAdviceの代わりに使用することができます。

おすすめ

転載: www.cnblogs.com/UncleWang001/p/10949318.html