使用springMVC提供的SimpleMappingExceptionResolver
<!-- 异常配置 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<span style="white-space:pre"> </span><!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception,页面使用${ex}获取 -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值,注意不要写成/exception/numberException -->
<property name="exceptionMappings">
<props>
<prop key="NumberFormatException">exception/numberException</prop>
<prop key="NullPointerException">exception/nullException</prop>
</props>
</property>
<!-- 定义默认的异常处理页面-->
<property name="defaultErrorView" value="exception/exception"/><!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图-->
<property name="statusCodes"><!-- 定义在发生异常时视图跟返回码的对应关系 -->
<props>
<prop key="exception/numberException">500</prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 -->
<prop key="exception/nullException">503</prop>
</props>
</property>
<property name="defaultStatusCode" value="404"/><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 -->
</bean>
使用@ExceptionHandler进行处理
使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面。
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("出错了!");
}
}
使用@ControllerAdvice来实现异常处理
@ControllerAdvice作用就是应用到所有@RequestMapping注解,解决了上述问题
package com.huihui.chy.demo1.exception;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class DefaultExceptionHandler {
/**
* 没有权限 异常
* <p/>
* 后续根据不同的需求定制即可
*/
@ExceptionHandler({MyException.class})
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public ModelAndView processUnauthenticatedException(NativeWebRequest request, MyException e) {
System.out.println("===========应用到所有@RequestMapping注解的方法,在其抛出MyException异常时执行:"+e.getMessage());
ModelAndView mv = new ModelAndView();
mv.addObject("ex", e.getMessage());
mv.setViewName("exception/exception");
return mv;
}
}
配置文件启用该注解
<context:component-scan base-package="com.huihui.chy.demo1.exception" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>