Heim  >  Artikel  >  Java  >  springMVC-Unterstützung für die Ausnahmebehandlung

springMVC-Unterstützung für die Ausnahmebehandlung

巴扎黑
巴扎黑Original
2017-06-26 09:21:201255Durchsuche

Unabhängig davon, welches Projekt Sie durchführen, ist die Ausnahmebehandlung sehr wichtig. Einige Fehlercodes, die nur Programmierer verstehen können, können nicht an Benutzer ausgegeben werden. Führen Sie daher zu diesem Zeitpunkt eine einheitliche Ausnahmebehandlung durch, um einen Vergleich anzuzeigen. Freundliche Fehlerseiten sind erforderlich . Wie andere MVC-Frameworks verfügt auch springMVC über einen eigenen Mechanismus zur Ausnahmebehandlung.
Es gibt zwei Hauptmöglichkeiten, um von springMVC bereitgestellte Ausnahmen zu verarbeiten. Dazu gehört natürlich auch die Verwendung von SimpleMappingExceptionResolver, die uns Spring zur Verfügung gestellt hat Spezialisierter Controller zur Behandlung von Ausnahmen – ExceptionHandler.

1. Implementieren Sie Ihren eigenen HandlerExceptionResolver. SpringMVC selbst verfügt über eine eigene Implementierung – DefaultHandlerExceptionResolver werden abgefangen und dann werden die entsprechenden Fehlercodes zurückgegeben. Natürlich können Sie auch die Klasse DefaultHandlerExceptionResolver erben und dann einige der Ausnahmebehandlungsmethoden neu schreiben, um Ihre eigene Ausnahmebehandlung zu implementieren.

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");  
    }  
  
}

Die obige „resolveException“ Die 4 Parameter geben an, welche Art von Ausnahme behandelt wird. Da die Exception-Klasse die Basisklasse aller Ausnahmeklassen ist, können Sie, wenn Sie je nach Ausnahmetyp eine unterschiedliche Verarbeitung durchführen möchten, in der Methode „resolveException“ je nach Ausnahmetyp eine unterschiedliche Verarbeitung durchführen und unterschiedliche Ausnahmeansichten zurückgeben. Zum Beispiel:

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");  
    }  
  
}

Nachdem Sie einen solchen Ausnahmehandler definiert haben, müssen Sie ein solches Bean-Objekt im applicationContext definieren, z. B.:

bean id="ExceptionResolver" class="com.tiantian.xxx.web.handler.ExceptionHandler" />
Zusätzlich zur Implementierung eines DefaultHandlerExceptionResolver implementiert Spring auch einen SimpleMappingExceptionResolver. Beide erben von der abstrakten Klasse AbstractHandlerExceptionResolver, und AbstractHandlerExceptionResolver implementiert die Methode „resolveException“ der Schnittstelle „HandlerExceptionResolver“ und extrahiert somit zwei abstrakte Methoden, eine ist die Methode „prepareResponse(Exception, Response), die vor der Ausnahmebehandlung ausgeführt wird, eine ist die Methode „doResolveException(“ (Anfrage, Antwort, Handler, Ausnahme) Methode zur Ausnahmeauflösung. SimpleMappingExceptionResolver verwendet, wie der Name schon sagt, eine einfache Zuordnungsbeziehung, um zu bestimmen, welche Ansicht die aktuelle Fehlermeldung verarbeiten soll. SimpleMappingExceptionResolver stellt die Zuordnungsbeziehung zwischen Ausnahmen und Ansichten über Ausnahmetyp-ExceptionMappings bereit und stellt StatusCodes bereit, um den von der Ausnahme zurückgegebenen Ansichtsnamen und den entsprechenden HttpServletResponse-Rückgabecode zuzuordnen, wenn eine Ausnahme auftritt. Und der Standardwert kann über „defaultErrorView“ und „defaultErrorCode“ angegeben werden. Wenn der entsprechende Ausnahmetyp nicht in „ExceptionMappings“ gefunden wird, wird die durch „defaultErrorView“ definierte Ansicht zurückgegeben, was bedeutet, dass er bei Auftreten einer Ausnahme nicht in „statusCodes“ gefunden wird , die Zuordnungsbeziehung zwischen der Ansicht und dem Rückgabecode. Die entsprechende Zuordnung ist der standardmäßig zurückgegebene Rückgabecode. Wenn bei Verwendung von SimpleMappingExceptionResolver eine Ausnahme auftritt, fügt SimpleMappingExceptionResolver das aktuelle Ausnahmeobjekt in sein eigenes Attribut „ExceptionAttribute“ ein. Wenn „ExceptionAttribute“ nicht angegeben ist, verwendet „ExceptionAttribute“ den Standardwert „Exception“.

Das Folgende ist ein einfaches Beispiel:

(1)Deklarieren Sie eine SimpleMappingExceptionResolver-Bean in der Servlet-Konfigurationsdatei von SpringMVC und konfigurieren Sie das Attribut ExceptionMappings und defaultExceptionView, um die entsprechende Beziehung zwischen Ausnahmen und Ansichten anzugeben

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) Zugriff wie folgt:

@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) Ausnahmeobjekte, auf die in Jsp-Seiten zugegriffen werden kann. Hier nehmen wir die Rückgabeansicht number.jsp von NumberFormatException als Beispiel:

Jsp-Code
springMVC-Unterstützung für die Ausnahmebehandlung
  
  
  
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-Unterstützung für die Ausnahmebehandlung
 
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中也没有定义的话,那么该异常就会被抛出来。

Das obige ist der detaillierte Inhalt vonspringMVC-Unterstützung für die Ausnahmebehandlung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn