Springmvc捕获全局异常

@ControllerAdvice注解的类内部如果有使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法将会被应用到所有被注解为@RequestMapping的方法中。当使用@ExceptionHandler最有用,另外两个目前还没用到过。

以下代码是捕获全局异常类:

/**
 * 全局捕获异常
 * 
 */
@ControllerAdvice
public class ControllerAdvice {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(ControllerAdvice.class);
            
    @Value("${active.profile}")
    private String activeProfile;//配置中的环境dev test pro

    @Autowired
    ProducerTemplate producerTemplate;//利用了apache camel 异步发送异常邮件

    @Autowired
    private UserService userService;

    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 全局捕获异常
     * 
     * @param throwable
     * @param request
     * @return
     * @throws IOException
     * @throws JsonProcessingException
     */
    @ExceptionHandler
    public Object exceptionHandler(Throwable throwable,
            HttpServletRequest request, HttpServletResponse response)
            throws JsonProcessingException, IOException {
        System.out.println("所有有@RequestMapping注解的方法,在其抛出异常时执行次方法");
            
        // Ajax请求
        Boolean isAjaxRequest = false;

        // ##
        // Ajax请求:是?否?
        String xRequestedWith = request.getHeader("X-Requested-With");
        if (StringUtils.isNotBlank(xRequestedWith)) {
            isAjaxRequest = true;
        }

        // ##
        // 异常明细
        User currentUser = userService.getCurrentUser();
        Map<String, Object> map = new TreeMap<String, Object>();
        // 1. 请求用户
        map.put("userId", currentUser.getId());
        map.put("username", currentUser.getUsername());
        // 2. 请求地址
        map.put("requestUri", request.getRequestURI());
        map.put("requestUrl", request.getRequestURL());
        // 3. 请求IP
        map.put("remote-addr", request.getRemoteAddr());
        map.put("x-forwarded-for", request.getHeader("x-forwarded-for"));
        // 4. Header
        map.put("User-Agent", request.getHeader("User-Agent"));
        // 5. 异常堆栈
        StringWriter writer = new StringWriter();
        throwable.printStackTrace(new PrintWriter(writer));
        map.put("stackTrace", writer.toString());
        System.out.println("》》》》》》》》》》》》》》异常信息" + writer.toString());
        // 6. 异常邮件
        if ("pro".equals(activeProfile)) {
            producerTemplate.sendBody(ErrorMailSenderRoute.URI, map);//发送邮件
        } else {
            LOGGER.info("非生产环境,无需发送异常邮件!");
        }
        // 请求返回:JSON
        if (isAjaxRequest) {
            ResponseBodyPayload rbp = new ResponseBodyPayload();
            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
            rbp.setErrorMsg("服务器开小差了...");
            rbp.setErrorResData(map);
            String responseJson = objectMapper.writeValueAsString(rbp);
            IOUtils.write(responseJson, response.getWriter());
            return null;
        }
        // 请求返回:Redirect
        else {
            return "redirect:/";
        }
    }

    /**
     * InitBinder
     * 
     * @param binder
     */
  //  @InitBinder
  //  public void initBinder(WebDataBinder binder) {
  //  System.out.println("所有被注解为@RequestMapping的方法,在其执行之前都会走这个方法进行初始化数据绑  //定器");  
  //
  //   }

    /**
     * ModelAttribute
     * 
     * @param model
     * @param request
     */
  //   @ModelAttribute
  //   public User modelDemo(Model model, HttpServletRequest request) {
  //      System.out.println("所有被注解为@RequestMapping的方法,在其执行之前把返回值放入Model");
  //     return new User();
  //  }

}



你可能感兴趣的:(Springmvc捕获全局异常)