SpringMVC异常处理

来源:互联网 发布:网络定向监控商品信息 编辑:程序博客网 时间:2024/06/03 05:05

SpringMVC异常处理

1、 Spring MVC处理异常有3种方式: 
1)使用Spring-MVC提供的SimpleMappingExceptionResolver 

此方法只需要在SpringMVC配置文件中增加异常处理配置即可:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  

    <!--定义默认的异常处理页面,当该异常类型的注册时使用 -->  

    <property name="defaultErrorView" value="error"></property>  

    <!--定义异常处理页面用来获取异常信息的变量名,默认名为exception -->  

    <property name="exceptionAttribute" value="ex"></property>  

   <!--定义需要特殊处理的异常,用类名或完全路径名作为key,异常以页名作为值-->  

    <property name="exceptionMappings">  

        <props>  

            <!--创建自己所要自定义的异常类 -->

 <prop key="com.core.exception.BusinessException">business_error</prop>  

 <prop key="com.core.exception.ParameterException">parameter_error</prop>  

<!-- key是我们的自定义异常类全称,值是要跳转的视图-->

<prop key="cn.bdqn.pojo.UserException">error</prop>

            <!--还可以继续扩展对不同异常类型的处理 -->  

        </props>  

    </property>  

</bean>

 

附上一个自定义异常类的代码:

public class UserExceptionextends RuntimeException{

private static final long serialVersionUID = 1L;

public UserException() {

super();

}

public UserException(Stringmessage, Throwable cause,

boolean enableSuppression,boolean writableStackTrace) {

super(message,cause, enableSuppression, writableStackTrace);

}

public UserException(Stringmessage, Throwable cause) {

super(message,cause);

}

public UserException(Stringmessage) {

super(message);

}

public UserException(Throwablecause) {

super(cause);

}

}

 

异常处理Controller

@RequestMapping(value="/login",method=RequestMethod.POST)

public String login(String userName,String password,HttpSession session){

if(!userList.containsKey(userName)){

throw new UserException("用户名不存在!");

}

User _user = userList.get(userName);

if(!_user.getPassword().equals(password)){

throw new UserException("密码不正确!");

}

session.setAttribute("loginUser", _user);

return "redirect:/user/userlist";

}

 

异常页面调用显示信息:

<body>

<!-- 相当于 catch(Exception ex)中的{ex.getMessage();}-->

${exception.message}

</body>


2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器; 
3)使用@ExceptionHandler注解实现异常处理; 

 

2、 未捕获异常的处理 
对于Unchecked Exception而言,由于代码不强制捕获,往往被忽略,如果运行期产生了UncheckedException,而代码中又没有进行相应的捕获和处理,则我们可能不得不面对尴尬的404500……等服务器内部错误提示页面。 
  我们需要一个全面而有效的异常处理机制。目前大多数服务器也都支持在Web.xml中通过<error-page>(Websphere/Weblogic)或者<error-code>(Tomcat)节点配置特定异常情况的显示页面。

 

修改Web.xml文件,示例如下:

<!-- 出错页面定义 -->  

<error-page>  

    <exception-type>java.lang.Throwable</exception-type>  

    <location>/500.jsp</location>  

</error-page>  

<error-page>  

    <error-code>500</error-code>  

    <location>/500.jsp</location>  

</error-page>  

<error-page>  

    <error-code>404</error-code>  

    <location>/404.jsp</location>  

</error-page>  

<!-- 可继续增加服务器错误号的处理及对应显示页面 -->

 

3、 比较异常处理方式的优缺点:
        Spring MVC集成异常处理3种方式都可以达到统一异常处理的目标。从3种方式的优缺点比较,若只需要简单的集成异常处理,推荐使用SimpleMappingExceptionResolver即可;若需要集成的异常处理能够更具个性化,提供给用户更详细的异常信息,推荐自定义实现HandlerExceptionResolver接口的方式;若不喜欢Spring配置文件或要实现“零配置”,且能接受对原有代码的适当入侵,则建议使用@ExceptionHandler注解方式。 

 

【注:WEB.XML,就是指定error-codepage到指定地址,这也是最传统和常见的做法

而Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等。各个方案之间没有依赖关系,可以相互独立使用。】

 

0 0