ホームページ  >  記事  >  Java  >  springMVC による例外処理のサポート

springMVC による例外処理のサポート

巴扎黑
巴扎黑オリジナル
2017-06-26 09:21:201294ブラウズ

どのようなプロジェクトを行っているかに関係なく、例外処理は非常に必要であり、プログラマのみが理解できる一部のエラーコードをユーザーにスローすることはできません。そのため、現時点では、統一された例外処理を実行して、よりわかりやすいエラーページを表示する必要があります。他の MVC フレームワークと同様に、springMVC にも独自の例外処理メカニズムがあります。 springMVC が提供する例外を処理するには、主に 2 つの方法があります。1 つは、独自の HandlerExceptionResolver を直接実装する方法で、もう 1 つは、Spring が提供する SimpleMappingExceptionResolver と DefaultHandlerExceptionResolver を使用する方法です。例外を処理する ExceptionHandler。

1. 独自の HandlerExceptionResolver を実装します。 SpringMVC 自体には独自の実装 (DefaultHandlerExceptionResolver) があり、対応するエラー コードを返します。 DefaultHandlerExceptionResolver クラスを継承し、その例外処理メソッドの一部を書き換えて独自の例外処理を実装することもできます。

import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.springframework.web.servlet.HandlerExceptionResolver;  
import org.springframework.web.servlet.ModelAndView;  
  
public class ExceptionHandler implements HandlerExceptionResolver {  
  
    @Override  public ModelAndView resolveException(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex) {  // TODO Auto-generated method stub  return new ModelAndView("exception");  
    }  
  
}

上記のresolveExceptionの4番目のパラメータは、どのタイプの例外が処理されるかを示します。 Exception クラスはすべての例外クラスの基本クラスであるため、例外の種類に応じて異なる処理を実行する場合は、resolveException メソッドで例外の種類に応じて異なる処理を実行し、異なる例外ビューを返すことができます。例:
public class ExceptionHandler implements HandlerExceptionResolver {  
  
    @Override  public ModelAndView resolveException(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex) {  // TODO Auto-generated method stub  if (ex instanceof NumberFormatException) {  //doSomething...  return new ModelAndView("number");  
        } else if (ex instanceof NullPointerException) {  //doSomething...  return new ModelAndView("null");  
        }  return new ModelAndView("exception");  
    }  
  
}

このような例外ハンドラを定義した後、次のように applicationContext でそのような Bean オブジェクトを定義する必要があります:

bean
id="ExceptionResolver" class= "com.tiantian.xxx.web.handler.ExceptionHandler" DefaultHandlerExceptionResolver の実装に加えて、Spring は SimpleMappingExceptionResolver も実装します。どちらも Abstract クラスから継承されます。 AbstractHandlerExceptionResolver と AbstractHandlerExceptionResolver は、HandlerExceptionResolver インターフェースのsolveException メソッドを実装するため、例外処理の前に実行されるメソッド prepareResponse (例外、応答) と、例外解決のための doResolveException の 2 つの抽象メソッドを抽出します。 、ハンドラー、例外)メソッド。 SimpleMappingExceptionResolver は、その名前が示すように、単純なマッピング関係を使用して、どのビューが現在のエラー メッセージを処理するかを決定します。 SimpleMappingExceptionResolver は、例外タイプExceptionMappings を通じて例外とビューの間のマッピング関係を提供し、例外が発生したときに例外によって返されるビュー名と対応する HttpServletResponse 戻りコードをマップする statusCodes を提供します。また、デフォルト値は、defaultErrorView およびdefaultErrorCode で指定できます。defaultErrorView は、例外が発生したときに、対応する例外タイプがExceptionMappings で見つからない場合に、defaultErrorView で定義されたビューが返されることを意味します。 、ビューと戻りコードの間のマッピング関係。対応するマッピングは、デフォルトで返される戻りコードです。 SimpleMappingExceptionResolver を使用する場合、例外が発生すると、SimpleMappingExceptionResolver は現在の例外オブジェクトを独自の属性ExceptionAttribute に入れます。

以下は簡単な例です:

(1) SpringMVCのサーブレット設定ファイルでSimpleMappingExceptionResolver Beanを宣言し、プロパティExceptionMappingsとdefaultExceptionViewを設定して例外とビューの対応関係を指定します

Xml代码
<bean>  
    <property>  
        <props>  
            <prop>number</prop><!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 -->  
            <prop>null</prop>  
        </props>  
    </property>  
    <property></property><!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图-->  
    <property><!-- 定义在发生异常时视图跟返回码的对应关系 -->  
        <props>  
            <prop>500</prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 -->  
            <prop>503</prop>  
        </props>  
    </property>  
    <property></property><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 -->  
</bean>
(2) 以下のようにアクセスします:

@Controller  
@RequestMapping("/test")  
public class TestController {  
  
    @RequestMapping("/null")  public void testNullPointerException() {  
        Blog blog = null;  //这里就会发生空指针异常,然后就会返回定义在SpringMVC配置文件中的null视图          System.out.println(blog.getId());  
    }  
      
    @RequestMapping("/number")  public void testNumberFormatException() {  //这里就会发生NumberFormatException,然后就会返回定义在SpringMVC配置文件中的number视图  Integer.parseInt("abc");  
    }  
      
    @RequestMapping("/default")  public void testDefaultException() {  if (1==1)  //由于该异常类型在SpringMVC的配置文件中没有指定,所以就会返回默认的exception视图  throw new RuntimeException("Error!");  
    }  
      
}

(3) J sp ページ、ここに NumberFormatException があります例としてビュー番号を返します:

  
  
  
nbsp;HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  
    
    <base>">  
      
    <title>My JSP 'number.jsp' starting page</title>  
      
    <meta>  
    <meta>  
    <meta>      
    <meta>  
    <meta>  
    <!--  
    <link rel="stylesheet" type="text/css" href="styles.css?1.1.11">  
    -->  
  
    
    
    
    NumberFormatException. <br>  
    <br>  
    <br><span><!-- 这是JSP中的内置对象exception --></span>  
  
  
  
    <br><span><!-- 这是SpringMVC放在返回的Model中的异常对象 --></span>  
  
  
  
    <span><!-- HttpServletResponse返回的错误码信息,因为前面已经配置了NumberFormatException的错误码返回值为888,所以这里应该显示888 --></span>  
  
  
  
    

(4)当请求/test/number.do的时候会返回定义好的number视图,返回结果如下:


 

2、使用@ExceptionHandler进行处理

 

使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面

 

如:

Java代码  springMVC による例外処理のサポート
 
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.ExceptionHandler;  
import org.springframework.web.bind.annotation.RequestMapping;  
  
import com.tiantian.blog.web.servlet.MyException;  
  
@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("出错了!");  
    }  
      
      
}

 

这里在页面上访问test方法的时候就会报错,而拥有该test方法的Controller又拥有一个处理该异常的方法,这个时候处理异常的方法就会被调用

 

 

优先级

既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题:

 

当发生异常的时候,SpringMVC会如下处理:

(1)SpringMVC会先从配置文件找异常解析器HandlerExceptionResolver

(2)如果找到了异常异常解析器,那么接下来就会判断该异常解析器能否处理当前发生的异常

(3)如果可以处理的话,那么就进行处理,然后给前台返回对应的异常视图

(4)如果没有找到对应的异常解析器或者是找到的异常解析器不能处理当前的异常的时候,就看当前的Controller中有没有提供对应的异常处理器,如果提供了就由Controller自己进行处理并返回对应的视图

(5)如果配置文件里面没有定义对应的异常解析器,而当前Controller中也没有定义的话,那么该异常就会被抛出来。

以上がspringMVC による例外処理のサポートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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