麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

SpringMVC 異常處理

2019-11-15 00:38:06
字體:
供稿:網(wǎng)友
SPRingMVC 異常處理Using HTTP Status Codes

在我們自定義的異常上使用ResponseStatus注解。當(dāng)我們的Controller拋出異常,并且沒有被處理的時候,他將返回HTTP STATUS 為指定值的 HTTP RESPONSE,比如:

    @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order")  // 404    public class OrderNotFoundException extends RuntimeException {        // ...    }

我們的Controller為:

 @RequestMapping(value="/orders/{id}", method=GET)    public String shoWorder(@PathVariable("id") long id, Model model) {        Order order = orderRepository.findOrderById(id);        if (order == null) throw new OrderNotFoundException(id);        model.addAttribute(order);        return "orderDetail";    }

這時候會返回404,轉(zhuǎn)到404頁面而不是錯誤頁面

Controller Based Exception Handling

在一個Controller中,,注意這種只在單個Controller中有效。這么做可以:

  1. 發(fā)生異常后,改變Response status,一般而言,發(fā)生異常返回HTTP STATUS 500.我們可以變?yōu)槠渌?/li>
  2. 發(fā)生錯誤后轉(zhuǎn)到錯誤頁面
  3. 可以為不同異常定義不同處理(如不同的錯誤頁面,不同的Response status)

舉例說明

@Controllerpublic class ExceptionHandlingController {  // 我們標(biāo)注了@RequestMapping的方法  ...    //處理異常的方法。    // 把我們定義的異常轉(zhuǎn)換為特定的Http status code  @ResponseStatus(value=HttpStatus.CONFLICT, reason="Data integrity violation")  // 409  @ExceptionHandler(DataIntegrityViolationException.class)  public void conflict() {    // Nothing to do  }    // 捕獲到SQLException,DataaccessException異常之后,轉(zhuǎn)到特定的頁面。  @ExceptionHandler({SQLException.class,DataAccessException.class})  public String databaseError() {    //僅僅轉(zhuǎn)到錯誤頁面,我們在頁面上得不到這個Exception的值,要得到值,我們可以通過下面的方法得到    return "databaseError";  }  // 通過ModelAndView返回頁面,以及往頁面?zhèn)飨鄳?yīng)的值  @ExceptionHandler(Exception.class)  public ModelAndView handleError(HttpServletRequest req, Exception exception) {    logger.error("Request: " + req.getRequestURL() + " raised " + exception);    ModelAndView mav = new ModelAndView();    mav.addObject("exception", exception);    mav.addObject("url", req.getRequestURL());    mav.setViewName("error");    return mav;  }}
Global Exception Handling

在類上使用 @ControllerAdvice注解,可以使得我們處理整個程序中拋出的異常。。舉例:

class GlobalControllerExceptionHandler {    @ResponseStatus(HttpStatus.CONFLICT)  // 409    @ExceptionHandler(DataIntegrityViolationException.class)    public void handleConflict() {        // Nothing to do    }       //轉(zhuǎn)到特定頁面 。。。。。}

如果我們要處理程序中所有的異常可以這么做:

@ControllerAdviceclass GlobalDefaultExceptionHandler {    public static final String DEFAULT_ERROR_VIEW = "error";    @ExceptionHandler(value = Exception.class)    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {        // If the exception is annotated with @ResponseStatus rethrow it and let        // the framework handle it - like the OrderNotFoundException example        // at the start of this post.        // AnnotationUtils is a Spring Framework utility class.        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {            throw e;        }        // Otherwise setup and send the user to a default error-view.        ModelAndView mav = new ModelAndView();        mav.addObject("exception", e);        mav.addObject("url", req.getRequestURL());        mav.setViewName(DEFAULT_ERROR_VIEW);        return mav;    }}
Going Deeper

實(shí)現(xiàn)HandlerExceptionResolver接口,SpringMvc可以使用他來處理Controller中拋出的異常

public interface HandlerExceptionResolver {    ModelAndView resolveException(HttpServletRequest request,             HttpServletResponse response, Object handler, Exception ex);}

SpringMvc使用三種默認(rèn)的HandlerExceptionResolver來處理我們的異常

  1. ExceptionHandlerExceptionResolver:
  2. ResponseStatusExceptionResolver:
  3. DefaultHandlerExceptionResolver:把Spring定義的一些標(biāo)準(zhǔn)異常,轉(zhuǎn)換為HTTP STATUS CODE.

Spring內(nèi)置的SimpleMappingExceptionResolver實(shí)現(xiàn)了HandlerExceptionResolver接口,也是我們經(jīng)常使用的,xml配置如下:

<bean id="simpleMappingExceptionResolver"          class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">        <property name="exceptionMappings">            <map>                <!-- key為異常類型,value為要轉(zhuǎn)到的頁面 -->                <entry key="DatabaseException" value="databaseError"/>                <entry key="InvalidCreditCardException" value="creditCardError"/>            </map>        </property>        <!-- 默認(rèn)的異常頁面 -->        <property name="defaultErrorView" value="error"/>        <!-- 在頁面我們可以通過ex拿到異常信息 -->        <property name="exceptionAttribute" value="ex"/>                <!-- Name of logger to use to log exceptions. Unset by default, so logging disabled -->         <!-- log異常信息,默認(rèn)不設(shè)置-不記錄異常信息 -->        <property name="warnLogCategory" value="example.MvcLogger"/>    </bean>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久国产一级片 | 亚洲经典视频 | 国产成人精品网站 | 中国久久久 | 亚洲婷婷日日综合婷婷噜噜噜 | 久久蜜臀一区二区三区av | 亚洲精品成人av在线 | 精品久久久久久久久久久久久 | 中文字幕在线播放一区 | 久草热久| 色污视频在线观看 | 欧美亚洲国产一区二区三区 | 福利免费在线观看 | 日韩视频一区二区 | 亚州精品在线视频 | 亚洲精品无码不卡在线播放he | 欧美性色黄大片www 成人免费网站在线观看 | xxx日本视频| 亚洲最大av网站 | 久久久久久久亚洲视频 | 成人毛片网| 国产视频软件在线 | 在线播放av片 | 国产乱乱视频 | 日韩视频1 | 午夜亚洲视频 | 日韩视频1 | 欧美成人一级片 | 久久精品亚洲欧美日韩精品中文字幕 | 久久蜜桃精品一区二区三区综合网 | 97视频一二区 | 国产v综合v亚洲欧美久久 | 天天草天天爱 | 国产精品一区2区3区 | 污黄视频在线观看 | 久色porn| 国产亚洲精品久久久闺蜜 | a级黄色片视频 | 国产一级毛片高清视频完整版 | 国产精品成人亚洲一区二区 | 黄色片快播 |