zoukankan      html  css  js  c++  java
  • SpringMVC异常体系

    在服务端经常会遇到需要手动的抛出异常,比如业务系统,校验异常,比较通用的处理方案是在最顶层进行拦截异常,例如Struts的全局异常处理,而Spring的异常处理机制就相对于Struts来说好用多了

     
    首先配置方案如下:
     
    第一种:配置式
    <!-- 基于配置文件式的异常处理 -->
     <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
            <property name="exceptionMappings">  
                <props>  
                    <prop key="org.apache.shiro.authz.UnauthorizedException">error/403</prop>
                    <prop key="com.sirdc.modules.exceptions.ServiceException">error/503</prop>
                </props>  
            </property>  
        </bean>
     
    第二种:注解式
     <!-- 基于注解式子的异常处理 -->
     <bean id="exceptionHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean>
     
    然后在后端采用@ControllerAdvice注解进行处理
     
    import java.util.List;
     
    import javax.validation.ConstraintViolationException;
     
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.context.request.NativeWebRequest;
    import org.springframework.web.servlet.ModelAndView;
     
    import com.sirdc.modules.exceptions.ServiceException;
    import com.sirdc.modules.validator.BeanValidators;
    import com.sirdc.modules.web.model.Message;
     
    /**
     * 自定义统一异常处理中心
     * @author: weihuang.peng
     * @version Revision: 0.0.1
     * @Date: 2015年1月17日
     */
    @ControllerAdvice
    public class DefaultExceptionHandler {
     
     /**
      * 处理业务异常
      * @param request
      * @param model
      * @param exception
      * @return Model
      */
     @ExceptionHandler({ServiceException.class})
    public ModelAndView processServiceException(NativeWebRequest request, ServiceException exception) { 
          ModelAndView model = new ModelAndView("/error/503");
          model.addObject("exception", exception);
          model.addObject("message", "服务器未能处理您的请求");
          return model;
     
     /**
      * 处理校验异常
      * @param request
      * @param exception
      * @return
      */
     @ExceptionHandler({ConstraintViolationException.class})
     @ResponseBody
     public Message processConstraintViolationException(NativeWebRequest request, ConstraintViolationException exception) {
      exception.printStackTrace();
          List<String> list = BeanValidators.extractPropertyAndMessageAsList(exception, ": ");
          list.add(0, "数据验证失败:");
          return handleMessage(list.toArray(new String[] {}));
     }
     
     @ExceptionHandler({Exception.class})
     public ModelAndView processException(NativeWebRequest request, Exception exception) {
      exception.printStackTrace();
          ModelAndView model = new ModelAndView("/error/500");
          model.addObject("exception", exception);
          model.addObject("message", "服务器出错了");
          return model;
     }
     
     /**
      * 添加Flash消息
      * @param messages 消息
      * @return
      */
     protected Message handleMessage(String... messages) {
          Message model = new Message();
          StringBuilder sb = new StringBuilder();
          for (String message : messages) {
               sb.append(message).append(messages.length > 1 ? "<br/>" : "");
          }
          model.setCode("500");
          model.setMessage(sb.toString());
          return model;
     }
    }
  • 相关阅读:
    Windows 下安装 swoole 具体步骤
    Mysql 连接提示 Client does not support authentication protocol requested by server 客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端
    mysql8 安装
    在 apache 配置 python-django
    QQWry.dat导入Mysql显IP程序
    PHP根据身份证号码判断星座性别生肖身份证号15位转18位
    layer---table 处理 方法设定使用 时间戳转换
    数字的处理 :小数点四舍五入
    javascript 检测手机设备 百度siteapp下的一款跳转的产品,使用起来很方便。你可以用这款JS跳转到手机版,也可以跳转到任何你想跳转的位置。
    基于Token的多平台身份认证价格设计
  • 原文地址:https://www.cnblogs.com/Nonnetta/p/5060739.html
Copyright © 2011-2022 走看看